Pregunta

Estoy tratando de hacer que IODOC se ejecute en Heroku. Requiere Node.js y Redis. Es cierto que soy nuevo en todas estas tecnologías. No obstante, he logrado que se ejecute localmente. Sin embargo, recibo el siguiente error al implementar en Heroku.

2011-12-01T11:55:18+00:00 app[web.1]: Redis To Go - port: 9030 hostname: dogfish.redistogo.com
2011-12-01T11:55:18+00:00 app[web.1]: Express server listening on port 9694
2011-12-01T11:55:19+00:00 heroku[web.1]: State changed from starting to up
2011-12-01T11:55:21+00:00 app[web.1]:         ^
2011-12-01T11:55:21+00:00 app[web.1]: Error: Redis connection to localhost:6379 failed - ECONNREFUSED, Connection refused
2011-12-01T11:55:21+00:00 app[web.1]:     at Socket.<anonymous> (/app/node_modules/redis/index.js:123:28)
2011-12-01T11:55:21+00:00 app[web.1]:     at Socket.emit (events.js:64:17)
2011-12-01T11:55:21+00:00 app[web.1]:     at Array.<anonymous> (net.js:828:27)
2011-12-01T11:55:21+00:00 app[web.1]:     at EventEmitter._tickCallback (node.js:126:26)
2011-12-01T11:55:23+00:00 heroku[web.1]: State changed from up to crashed

La única vez que recibí una advertencia similar sobre mi apareamiento local fue cuando Redis no estaba funcionando. Por lo que puedo decir que el complemento Redis está habilitado para mi aplicación y en ejecución:

$ heroku config --long
NODE_ENV      => production
PATH          => bin:node_modules/.bin:/usr/local/bin:/usr/bin:/bin
REDISTOGO_URL => redis://redistogo:52847221366cb677460c306e4f482c5b@dogfish.redistogo.com:9030/

También he probado algunos configuración sugerencias. Ninguno de los dos parece funcionar.

// redis connection in app.js
var db;
if (process.env.REDISTOGO_URL) {
   var rtg = require("url").parse(process.env.REDISTOGO_URL);
// tried this line as well... gave a different error on .connect();
// db = require('redis-url').connect(process.env.REDISTOGO_URL);
   db = redis.createClient(rtg.port, rtg.hostname);
   db.auth(rtg.auth.split(":")[1]);

   // debug
   sys.puts('Redis To Go - port: ' + rtg.port + ' hostname: ' + rtg.hostname);
} else {
   db = redis.createClient(config.redis.port, config.redis.host);
   db.auth(config.redis.password);
}

De la diferencia en mi Redis para ir línea de depuración y Error, Estoy seguro de que este es un problema de configuración. Pero no sé cómo solucionarlo. Cualquier ayuda es muy apreciada.

¿Fue útil?

Solución 2

De hecho, esto tenía que ver con la configuración de Redis en Heroku. Había líneas adicionales que requerían actualizaciones en Docs de E/S App.js.

Al final, respalé el global config Objeto en la parte superior (~ línea 60) después de oler el entorno de producción (Heroku).

if (process.env.REDISTOGOURL) {
  // use production (Heroku) redis configuration
  // overwrite config to keep it simple
  var rtg = require(‘url’).parse(process.env.REDISTOGOURL);
  config.redis.port = rtg.port;
  config.redis.host = rtg.hostname;
  config.redis.password = rtg.auth.split(“:”)[1];
}

Creé una publicación de blog para Instalar, configurar e implementar documentos de E/S Eso incluye esto, así como otros cambios que se requerían para ejecutar documentos de E/S. Le recomiendo que lo revise si está interesado en este proyecto.

Gracias a Jan Jongboom y Kirsten Jones por ayudarme a comenzar. Además, creo que el proyecto se ha actualizado en GitHub para incluir la configuración de Heroku fuera de la caja. Sin embargo, todavía tengo que probarlo.

Otros consejos

Según esta línea:

2011-12-01T11:55:21+00:00 app[web.1]: Error: Redis connection to localhost:6379 failed - ECONNREFUSED, Connection refused

Estás tratando de conectarte a localhost:6379, pero el servidor Redis se está ejecutando en redis://redistogo:52847221366cb677460c306e4f482c5b@dogfish.redistogo.com:9030/. ¿Puede intentar conectarse con esa URL manualmente y ver si eso funciona?

De hecho, tengo una publicación de blog sobre cómo hacer que los yodocs funcionen en Heroku. Tiene los cambios de configuración necesarios para que el Redis funcione en Heroku con IODOCS.

http://www.princesspolymath.com/princess_polymath/?p=489

Aquí están los cambios de código necesarios: agregue el siguiente bloque en "var db"; a la aplicación.

if (process.env.REDISTOGO_URL) {
   var rtg   = require("url").parse(process.env.REDISTOGO_URL);
   db = require("redis").createClient(rtg.port, rtg.hostname);
   db.auth(rtg.auth.split(":")[1]);
} else {
   db = redis.createClient(config.redis.port, config.redis.host);
   db.auth(config.redis.password);
}

Y luego esto en la sección de configuraciones de la API de carga, después de leer el archivo de configuración:

var app = module.exports = express.createServer();
var hostname, port, password
if (process.env.REDISTOGO_URL) {
    var rtg   = require("url").parse(process.env.REDISTOGO_URL);
    hostname = rtg.hostname;
    port = rtg.port;
    password = rtg.auth.split(":")[1];
} else {
    hostname = config.redis.host;
    port = config.redis.port;
    password = config.redis.password;
}

Recientemente, una forma más limpia sería usar el Redis-URL Módulo que maneja la configuración.

Estoy personalmente usando Express con Redis (a través del complemento Redis To Go) como una tienda de sesión, y funciona bien en Heroku.

Exemplo:

const express           = require('express')

    , redis             = process.env.REDISTOGO_URL 
        ? require('redis-url').connect(process.env.REDISTOGO_URL) 
        : require('redis').createClient()

    , RedisStore        = require('connect-redis')(express)
    , sessionStore      = new RedisStore({ client: redis })
    , app               = express.createServer();

[...]

app.configure(function() {
    this
        .use(express.session({
            secret: 'mySecretHash', 
            store: sessionStore // Set redis as the sessionStore for Express
        }));
});
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top