[英]HTTP request in Meteor's package.js
在autopublish.meteor.com上,我们正在尝试检索有关程序包的一些外部数据,即它从GitHub或NPM注册中心发布的最新发布标签:
var version;
try {
var packageJson = JSON.parse(Npm.require('fs').readFileSync('package.json'));
version = packageJson.version;
} catch (e) {
// package.json won't be found when running the example with the local copy
// of the package because the current directory isn't the package dir
// ... so fall back to other methods of getting the version
version = HTTP.get('...').data.version;
}
Package.describe({
name: 'foo',
summary: 'bar',
version: version,
});
问题是HTTP软件包在package.js
不可用。
我已经尝试通过Npm.require('request')
使用request模块 ,但是该模块是异步的,并且...
request.get('http://registry.npmjs.org/summernote/latest', function (err, res, body) {
...
Package.describe({
...
});
});
...失败,因为Package.describe
需要在光纤中运行:
错误:流星代码必须始终在光纤中运行。 尝试使用Meteor.bindEnvironment包装传递给非Meteor库的回调。
这样做的问题是package.js
也不提供Meteor单例。
有没有办法做到这一点?
我尝试过的其他方法:
使用NPM api,例如npm.view('summernote');
-不起作用,因为您不能Npm.require('npm')
:
在package.js中,Npm.require只能找到内置模块。
使用execFileSync调用npm
二进制文件,但这不起作用,因为execFileSync仅在Node v0.12.0中可用,而Meteor尚未使用 。
在光纤中运行意味着使用节点光纤,因此您可以像使用Npm.require('fibers/future')
请求一样添加它。
因此,此代码为该模块获取了“ 0.6.1”版本:
var request = Npm.require('request');
var Future = Npm.require('fibers/future');
var fut = new Future();
request.get('http://registry.npmjs.org/summernote/latest', function (err, res, body) {
if (! err){
fut.return (body);
}
});
var body = JSON.parse(fut.wait());
Package.describe({
name: 'foo',
summary: 'bar',
version: body.version
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.