繁体   English   中英

流星的package.js中的HTTP请求

[英]HTTP request in Meteor's package.js

在autopublish.meteor.com上,我们正在尝试检索有关程序包的一些外部数据,即它从GitHubNPM注册中心发布的最新发布标签:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM