Как я могу развернуть модули node в приложении Meteor на meteor.com?

У меня есть приложение, которое использует модуль node twit, который доступен через

npm install twit

Я развернул модуль node локально из   .meteor/локальные/сборки/сервер/

Таким образом, это видно на   .meteor/локальные/сборки/сервер/ node_modules/кретин

Я попытался установить его в корне проекта, но проект не нашел модуль. Это привело меня к описанному выше решению.

Мое приложение теперь отлично работает локально. Я могу запускать и делать все и взаимодействовать с Twitter со стороны сервера Meteor или на стороне клиента в зависимости от того, что я хочу делать. Нет сбоев.

Когда я развертываю на 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

Есть ли у кого-нибудь какие-либо предложения о том, как это можно сделать?

Ответ 1

Наконец, я написал так. он работает как на локальном, так и на метеорном порте. спасибо Ian: D

установить модуль npm внутри "app/public":

    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

Начиная с Meteor 6.0, теперь нам нужно использовать Npm.require(). Кроме того, мы должны объявить модуль глобальными переменными, так как у Метеор теперь есть область уровня файла.

  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

Ответ 3

Ответа на этот вопрос JonathanKingston от meteor irc. Ссылка на метеоритный проект

Поместите модули node в общий каталог проектов.

Используйте этот код так, чтобы он загружался.

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

Метеоровое развертывание должно работать после этого, заставьте меня за то, что вы разместили мои модули node на сервере dirs

Ответ 4

Просто потратил полчаса, выяснив "установить модуль npm внутри шага app/public и подумал, что я сохраню следующего человека некоторое время. Из домашнего каталога приложения:

cd public
mkdir node_modules
npm install foo

По умолчанию npm install foo устанавливает "локально", но если в вашем текущем каталоге нет node_modules, то он перемещается вверх по дереву каталогов, ища его. В результате я установил пакет $HOME/node_modules/foo вместо локального проекта. Fine для localhost, но не столько для развертывания.

(Благодаря npm install локально для решения моей основной проблемы.)

Ответ 5

Этот код работал у меня с установкой 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')

Также может быть хорошей идеей создать файл packages.json внутри. /public для упрощения обновления/установки через npm.

Да здравствует Метеор!

Ответ 6

Изменено:

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

в

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

Ответ 7

Вы

base = base + "/bundle"

чтобы заставить это работать.