19

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

npm install twit

我从 .meteor/local/build/server/ 在本地部署了节点模块

因此,它在 .meteor/local/build/server/node_modules/twit 可见

我尝试在项目根目录安装它,但项目没有找到该模块。这导致我找到了上述有效的解决方案。

我的应用程序现在在本地运行良好。我能够运行和做所有事情,并且可以根据我想要做的事情从我的 Meteor 服务器端或客户端与 Twitter 交互。没有崩溃。

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

meteor deploy [appname] --password

应用程序部署成功。

当我尝试从浏览器访问 (app at 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

有人对如何实现这一点有任何建议吗?

4

7 回答 7

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
于 2013-06-30T23:57:26.273 回答
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');
});
于 2012-10-04T15:19:04.633 回答
7

从流星 irc 上的 JonathanKingston 找到答案。提到流星项目

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

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

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');
}

之后流星部署应该可以工作,我把我的节点模块放在服务器目录中

于 2012-05-08T09:51:09.623 回答
4

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

cd public
mkdir node_modules
npm install foo

默认情况下,npm install foo“本地”安装,但如果当前目录中没有node_modules文件夹,则它会向上移动目录树来寻找一个。我最终安装了包$HOME/node_modules/foo而不是本地项目。很好localhost,但不适合部署。

(感谢npm install local解决了我的根本问题。)

于 2013-10-27T11:35:50.733 回答
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 更轻松地更新/安装。

流星万岁!

于 2014-06-05T01:41:12.197 回答
1

改变:

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

到:

var modulePath = base + (isBundle ? '/bundle/static' : '/../web.browser/app') + '/node_modules/'
于 2015-11-17T23:27:24.927 回答
0

base = base + "/bundle"

让它发挥作用。

于 2012-08-14T03:32:06.663 回答