Как я могу развернуть модули 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"
чтобы заставить это работать.