在 autopublish.meteor.com,我们正在尝试检索有关软件包的一些外部数据,即其最新版本标签 from GitHub或the NPM registry :
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
中不可用。
我尝试过使用the request module ,通过 Npm.require('request')
,但该模块是异步的并且...
request.get('http://registry.npmjs.org/summernote/latest', function (err, res, body) {
...
Package.describe({
...
});
});
...失败,因为 Package.describe
需要在 Fiber 中运行:
Error: Meteor code must always run within a Fiber. Try wrapping callbacks that you pass to non-Meteor libraries with Meteor.bindEnvironment.
问题是 Meteor 单例在 package.js
中也不可用。
有办法做到这一点吗?
<小时/>我尝试过的其他事情:
使用 NPM api,例如
npm.view('summernote');
- 不起作用,因为你不能Npm.require('npm')
:In package.js, Npm.require can only find built-in modules.
使用 execFileSync 调用
npm
二进制文件,但这不起作用,因为 execFileSync 仅在 Node v0.12.0, which Meteor doesn't use yet 中可用。 .
最佳答案
在光纤中运行意味着使用 node-fibers因此您可以像使用 Npm.require('optics/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
});
关于javascript - Meteor 的 package.js 中的 HTTP 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28848733/