Question

Je suis en train de faire IODocs courir sur Heroku. Elle exige Node.js et Redis. Certes, je suis nouveau à toutes ces technologies. Néanmoins, j'ai réussi à le faire fonctionner localement. Cependant, je reçois l'erreur suivante lors du déploiement de 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 seule fois que je reçu un avertissement similaire sur mon accouplement local était quand Redis ne fonctionnait pas. D'après ce que je peux dire aux Redis add-on est activé pour mon application et en cours d'exécution:

$ 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/

J'ai aussi essayé quelques suggestions. Ni semblent fonctionner.

// 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 différence dans mon Redis To Go ligne de débogage et Erreur , je suis sûr que cela est un problème de configuration. Mais ne sais pas comment le résoudre. Toute aide est grandement appréciée.

Était-ce utile?

La solution 2

a en effet à voir avec la configuration Redis sur Heroku. Il y avait des lignes supplémentaires nécessitant des mises à jour dans I / O Docs app.js.

En fin de compte, je piggy soutenu par l'objet global config à l'environnement supérieur (~ ligne 60) après flairer la production (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];
}

Je créé un blog pour l'installation, la configuration et déploiement d'E / S Docs qui comprend aussi bien que d'autres changements qui ont été nécessaires pour exécuter I / O Docs. Je vous recommande de consulter si vous êtes intéressé par ce projet.

Merci à Jan Jongboom et Kirsten Jones pour moi aider à commencer. De plus, je crois que le projet a été mis à jour sur GitHub pour inclure sur la configuration Heroku de la boîte. Cependant, je n'ai pas encore de le tester.

Autres conseils

Selon cette ligne:

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

Vous essayez de vous connecter à localhost:6379, mais le serveur est en cours d'exécution à Redis redis://redistogo:52847221366cb677460c306e4f482c5b@dogfish.redistogo.com:9030/. Pouvez-vous essayer de vous connecter à cette URL manuellement et voir si cela fonctionne?

J'ai en fait un blog sur la façon d'obtenir IODocs travaillant sur Heroku. Il a le config changements nécessaires pour obtenir le REDIS travailler sur Heroku avec IODocs.

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

Voici les modifications de code nécessaires: Ajoutez le bloc suivant sous « var db; » à l'application de:.

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

Et puis cela dans la section API de charge Configs, après avoir lu le fichier de configuration:

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

Récemment, une façon plus propre serait d'utiliser le module Redis-url qui gère la configuration .

J'utilise Express avec Redis personnellement (via le module Redis To Go) comme sessionStore, et il fonctionne bien sur Heroku.

Exemple:

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
        }));
});
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top