react - meteor tutorial
¿Cómo puedo implementar módulos de nodo en una aplicación Meteor en meteor.com? (7)
Respuesta encontrada de JonathanKingston en meteor irc. Referido al proyecto meteórico
Coloque módulos de nodo en el directorio público de proyectos.
Use un código como este para asegurarse de que se carga.
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'');
}
La implementación del meteorito debería funcionar después de eso, escúchame por poner mis módulos de nodos en los directorios del servidor
Tengo una aplicación que usa el módulo twit de nodo que está disponible a través de
npm install twit
Implementé el módulo de nodo localmente desde .meteor / local / build / server /
Por lo tanto, es visible en .meteor / local / build / server / node_modules / twit
Intenté instalarlo en la raíz del proyecto, pero el proyecto no encontró el módulo. Lo que me llevó a la solución anterior que funciona.
Mi aplicación ahora funciona bien localmente. Puedo ejecutar y hacer todo, y puedo interactuar con Twitter desde el lado del servidor de Meteor o desde el lado del cliente, dependiendo de lo que quiero hacer. Sin choques
Cuando despliegue a meteor.com a través del comando
meteor deploy [appname] --password
La aplicación se implementa con éxito.
Cuando intento acceder a la (aplicación en anonistream.meteor.com) [anonistream.meteor.com] desde un navegador, falla y los registros contienen este error.
[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
¿Alguien tiene alguna sugerencia sobre cómo se puede lograr esto?
Tú
base = base + "/bundle"
para hacer que esto funcione
finalmente, escribí así. funciona tanto en local como en meteor. thx Ian: D
instalar el módulo npm dentro de "aplicación / público":
app/public# npm install MODULE_NAME
dentro de la aplicación / servidor / servidor.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'');
});
A partir de Meteor 6.0, ahora necesitamos usar Npm.require () en su lugar. Además, debemos declarar el módulo como variables globales, ya que Meteor ahora tiene alcance de nivel de archivo.
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
Este código funcionó para mí con meteor 0.8.x y node_modules siendo instalados en ./public de mi aplicación:
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'')
También puede ser una buena idea crear el archivo packages.json dentro de ./public para facilitar las actualizaciones / instalaciones a través de npm.
Larga vida a Meteor!
Cambiado:
var modulePath = base + (isBundle ? ''/bundle/static'' : ''/../client/app'') + ''/node_modules/''
a:
var modulePath = base + (isBundle ? ''/bundle/static'' : ''/../web.browser/app'') + ''/node_modules/''
Acabo de pasar media hora descifrando el "módulo de instalar npm dentro de la app/public
paso app/public
y pensé que podría salvar a la siguiente persona en algún momento. Desde el directorio principal de la aplicación:
cd public
mkdir node_modules
npm install foo
De forma predeterminada, npm install foo
instala "localmente", pero si no hay ninguna carpeta node_modules
en su directorio actual, entonces se mueve hacia el árbol de directorios buscando una. Estaba terminando con el paquete de instalación en $HOME/node_modules/foo
lugar del proyecto local. localhost
bien para el localhost
, pero no tanto para el despliegue.
(Gracias a npm instalo localmente para resolver mi problema de raíz).