我有一个使用通过
提供的节点twit模块的应用程序npm install twit
我从本地部署了节点模块 .meteor /本地/建造/服务器/
所以,它是可见的 .meteor /本地/建造/服务器/ node_modules /蠢
我尝试在项目根目录下安装它,但项目没有找到该模块。这使我得到了上述有效的解决方案。
我的应用程序现在在本地运行良好。我可以运行并做所有事情,并可以从我的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
有没有人对如何实现这一点有任何建议?
答案 0 :(得分:14)
从Meteor 6.0开始,现在我们需要使用Npm.require()。另外,我们需要将模块声明为全局变量,因为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
答案 1 :(得分:8)
最后,我这样写了。 它适用于本地和流星服务器。伊恩:D
在“app / public”中安装npm模块:
app/public# npm install 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');
});
答案 2 :(得分:7)
来自JonathanKingston的关于meteor irc的回答。提到meteoric project
将节点模块放在项目公共目录中。
使用这样的代码来确保它加载。
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 deploy应该在那之后找到,让我把我的节点模块放在服务器dirs中
答案 3 :(得分:4)
花了半个小时搞清楚app/public
步骤中的“安装npm模块”并认为我会保留下一个人的某个时间。从你应用程序的主目录:
cd public
mkdir node_modules
npm install foo
默认情况下,npm install foo
安装“本地”,但如果当前目录中没有node_modules
文件夹,则它会向上移动目录树以查找其中一个文件夹。我最终在$HOME/node_modules/foo
而不是本地项目中安装了软件包。适用于localhost
,但不是部署。
(感谢npm install locally解决我的根本问题。)
答案 4 :(得分:2)
此代码适用于我的meteor 0.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中创建packages.json文件也是一个好主意,以便通过npm更轻松地进行更新/安装。
万岁流星!
答案 5 :(得分:1)
更改:
var modulePath = base + (isBundle ? '/bundle/static' : '/../client/app') + '/node_modules/'
为:
var modulePath = base + (isBundle ? '/bundle/static' : '/../web.browser/app') + '/node_modules/'
答案 6 :(得分:0)
您
base = base + "/bundle"
让这个工作。