【问题标题】:node.js and Redis on Heroku for IODocs用于 IODocs 的 Heroku 上的 node.js 和 Redis
【发布时间】:2011-12-02 00:20:27
【问题描述】:

我正在尝试让 IODocs 在 Heroku 上运行。它需要 node.js 和 Redis。诚然,我对所有这些技术都是新手。尽管如此,我还是设法让它在本地运行。但是,我在部署到 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

我唯一一次收到关于本地交配的类似警告是在 Redis 未运行时。据我所知,Redis 插件已为我的应用启用并正在运行:

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

我也尝试了一些configurationsuggestions。两者似乎都不起作用。

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

从我的 Redis To Go 调试行和 Error 的区别来看,我确定这是一个配置问题。但不知道如何解决。非常感谢任何帮助。

【问题讨论】:

    标签: node.js heroku redis iodocs


    【解决方案1】:

    根据这一行:

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

    您正在尝试连接到localhost:6379,但redis 服务器正在redis://redistogo:52847221366cb677460c306e4f482c5b@dogfish.redistogo.com:9030/ 运行。您可以尝试手动连接到该 URL 并查看是否有效吗?

    【讨论】:

    • 我会试一试。这很奇怪,因为我的 Redis To Go 调试行显示了正确的配置并且在同一个块中。
    • 这是一个超级高级的技巧。在Cloud9 IDE 中打开它(可以通过 Git repo 执行此操作),这样您就可以实际将调试器放在上面并实时检查变量。在这种情况下可以节省大量时间。您仍然可以连接到与您现在连接的相同的 redis 实例。
    • 我会检查的。问题是我目前不知道任何这些技术。虽然我可以识别问题,但我什至不确定如何编写代码以连接到 Redis。
    【解决方案2】:

    这确实与 Heroku 上的 Redis 配置有关。在 I/O Docs app.js 中有其他行需要更新。

    最后,在嗅探出生产(Heroku)环境后,我在顶部(~第 60 行)搭载了全局 config 对象。

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

    我为 installing, configuring, and deploying I/O Docs 创建了一篇博文,其中包括此内容以及运行 I/O 文档所需的其他更改。如果您对此项目感兴趣,我建议您查看它。

    感谢 Jan Jongboom 和 Kirsten Jones 帮助我入门。此外,我相信该项目已经在 GitHub 上更新,包括开箱即用的 Heroku 配置。但是,我还没有测试它。

    【讨论】:

      【解决方案3】:

      我实际上有一篇关于如何让 IODocs 在 Heroku 上工作的博客文章。它具有使 REDIS 使用 IODocs 在 Heroku 上工作所需的配置更改。

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

      以下是所需的代码更改: 在“var db;”下添加以下块到应用程序的:

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

      然后在 Load API Configs 部分,读取配置文件后:

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

      【讨论】:

      • 是的,我知道。如果你看我的问题,我参考了你的帖子。但是,您建议的配置不起作用。我能够以其他方式解决这个问题,并在几周前回复了你的帖子。我猜你从来没有批准我的评论:)
      • 是的,我做到了,并编辑了帖子以添加我添加的部分(与你的有点不同)。很高兴我让它工作了:-)
      • 我偏爱我的解决方案 :) 它的逻辑钩子比你的少。谢谢你让我开始。在代码更改之前,我主要使用您的文章。一定是最近几天,我自己写了一篇关于 I/O Docs 的博客文章,因为你的文章过时了,我的评论没有被批准。
      【解决方案4】:

      最近,一种更简洁的方法是使用处理配置的redis-url 模块。

      我个人使用 Express 和 Redis(通过 Redis To Go 插件)作为 sessionStore,它在 Heroku 上运行良好。

      示例:

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

      【讨论】:

      • 我从Heroku Docs 中读到了同样的内容。我这样做是因为 config 在 I/O Docs 的其他地方使用。这是更新代码的更简洁的方法,而无需在任何地方包装条件。但是,如果我要为 Heroku 创建一个新应用程序,我会按照您的方式进行。
      猜你喜欢
      • 2012-06-19
      • 2012-05-02
      • 2019-04-05
      • 2014-11-25
      • 2017-02-15
      • 1970-01-01
      • 2022-06-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多