如何在meteor.com上的Meteor应用程序中部署节点模块?

我有一个应用程序使用可用的节点twit模块

npm install twit 

我从.meteor / local / build / server /

所以,它可以在.meteor / local / build / server / node_modules / twit中看到

我试着在项目根目录下安装它,但是项目没有find模块。 这导致了我的上述解决scheme的工作。

我的应用程序现在运行良好。 我能够运行并做所有事情,并可以从我的Meteor服务器端或客户端与Twitter进行交互,具体取决于我想要做什么。 没有崩溃。

当我通过命令部署到meteor.com

 meteor deploy [appname] --password 

应用程序成功部署。

当我尝试从浏览器访问(anonistream.meteor.com上的应用程序)[anonistream.meteor.com]时,它会失败,并且日志包含此错误。

 [Mon May 07 2012 01:59:53 GMT+0000 (UTC)] WARNING node.js:201 throw e; // process.nextTick error, or 'error' event on first tick ^ Error: Cannot find module 'twit' at Function._resolveFilename (module.js:332:11) at Function._load (module.js:279:25) at Module.require (module.js:354:17) at require (module.js:370:17) at app/server/server.js:2:12 at /meteor/containers/84162a7c-24e8-bf26-6fd8-e4ec13b2a935/bundle/server/server.js:111:21 at Array.forEach (native) at Function.<anonymous> (/meteor/containers/84162a7c-24e8-bf26-6fd8- e4ec13b2a935/bundle/server/underscore.js:76:11) at /meteor/containers/84162a7c-24e8-bf26-6fd8-e4ec13b2a935/bundle/server/server.js:97:7 [Mon May 07 2012 01:59:53 GMT+0000 (UTC)] INFO STATUS running -> waiting [Mon May 07 2012 01:59:53 GMT+0000 (UTC)] ERROR Application crashed with code: 1 [Mon May 07 2012 02:29:55 GMT+0000 (UTC)] INFO HIT / 24.94.158.145 [Mon May 07 2012 02:29:59 GMT+0000 (UTC)] INFO HIT /favicon.ico 24.94.158.145 [Mon May 07 2012 02:30:46 GMT+0000 (UTC)] INFO HIT / 24.94.158.145 [Mon May 07 2012 02:30:50 GMT+0000 (UTC)] INFO HIT /favicon.ico 24.94.158.145 

有没有人有任何build议,如何做到这一点?

最后,我写这样。 它在当地和meteor的作用。 伊恩:D

在“app / public”中安装npm模块:

     app / public#npm安装MODULE_NAME

在app / server / server.js里面:

 Meteor.startup(function () { var require = __meteor_bootstrap__.require; var path = require('path'); var base = path.resolve('.'); var isBundle = path.existsSync(base + '/bundle'); var modulePath = base + (isBundle ? '/bundle/static' : '/public') + '/node_modules'; var MODULE_NAME = require(modulePath + '/MODULE_NAME'); }); 

从Meteor 6.0开始,现在我们需要使用Npm.require()来代替。 此外,我们需要将模块声明为全局variables,因为Meteor现在具有文件级范围。

  var path = Npm.require('path'); var fs = Npm.require('fs'); var base = path.resolve('.'); var isBundle = fs.existsSync(base + '/bundle'); var modulePath = base + (isBundle ? '/bundle/static' : '/public') + '/node_modules'; MODULE_NAME = Npm.require(modulePath + '/MODULE_NAME'); // NOTE, this is going to be a global variable 

答案来自JonathanKingston,关于meteor irc。 提到meteor项目

将节点模块放置在项目公共目录中。

使用这样的代码来确保它加载。

 var require = __meteor_bootstrap__.require; var path = require("path"); var fs = require('fs'); var Twit; var twitPath = 'node_modules/twit'; var base = path.resolve('.'); if (base == '/'){ base = path.dirname(global.require.main.filename); } var publicPath = path.resolve(base+'/public/'+twitPath); var staticPath = path.resolve(base+'/static/'+twitPath); if (path.existsSync(publicPath)){ Twit = require(publicPath); } else if (path.existsSync(staticPath)){ Twit = require(staticPath); } else{ console.log('node_modules not found'); } 

之后,meteor部署应该find工作,find我的节点模块放在服务器端

刚花了半个小时搞清楚“在app/public步骤中安装npm模块,并认为我会保存下一个人一些时间。从你的应用程序的主目录:

 cd public mkdir node_modules npm install foo 

默认情况下, npm install foo会“在本地”安装,但是如果当前目录中没有node_modules文件夹,则会向上移动目录树,寻找其中的一个。 我结束了安装在$HOME/node_modules/foo而不是本地项目的软件包。 很好的localhost ,但没有这么多的部署。

(感谢npm在本地安装解决我的根本问题。)

这个代码为我工作meteor0.8.x和node_modules被安装在./public我的应用程序:

 var path = Npm.require('path') var fs = Npm.require('fs') var base = path.resolve('.') var isBundle = fs.existsSync(base + '/bundle') var modulePath = base + (isBundle ? '/bundle/static' : '/../client/app') + '/node_modules/' var twit = Npm.require(modulePath+'rssparser') 

在./public中创buildpackages.json文件也可能是一个好主意,通过npm更容易更新/安装。

万岁meteor!

更改:

 var modulePath = base + (isBundle ? '/bundle/static' : '/../client/app') + '/node_modules/' 

至:

 var modulePath = base + (isBundle ? '/bundle/static' : '/../web.browser/app') + '/node_modules/' 

 base = base + "/bundle" 

得到这个工作。