Meteor的package.js中的HTTP请求

时间:2015-03-04 07:26:23

标签: javascript node.js meteor

在autopublish.meteor.com上,我们正在尝试检索有关包的一些外部数据,即其最新发布标记from GitHubthe 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,
});

问题是package.js中没有HTTP包。

我尝试通过Npm.require('request')使用the request module,但该模块是异步的......

request.get('http://registry.npmjs.org/summernote/latest', function (err, res, body) {
  ...
  Package.describe({
    ...
  });
});

...失败,因为Package.describe需要在光纤中运行:

  

错误:Meteor代码必须始终在光纤内运行。尝试使用Meteor.bindEnvironment包装传递给非Meteor库的回调。

问题是Meteor单例在package.js中也不可用。

有办法吗?


我尝试过的其他事情:

  • 使用NPM api,例如npm.view('summernote'); - 无效,因为您无法Npm.require('npm')

      

    在package.js中,Npm.require只能找到内置模块。

  • 使用execFileSync调用npm二进制文件,但这不起作用,因为execFileSync仅在Node v0.12.0, which Meteor doesn't use yet中可用。

1 个答案:

答案 0 :(得分:1)

在光纤中运行意味着使用node-fibers,因此您可以像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
});