0

我正在尝试让 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/

我也尝试了一些配置 建议。两者似乎都不起作用。

// 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的差异来看,我确信这是一个配置问题。但不知道如何解决。任何帮助是极大的赞赏。

4

4 回答 4

1

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

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

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

我为安装、配置和部署 I/O Docs创建了一篇博文,其中包括运行 I/O Docs 所需的其他更改。如果您对此项目感兴趣,我建议您查看它。

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

于 2012-01-15T00:30:50.473 回答
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 并查看是否有效吗?

于 2011-12-02T08:57:21.550 回答
0

实际上,我有一篇关于如何让 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;
}
于 2012-01-04T17:56:48.127 回答
0

最近,一种更简洁的方法是使用处理配置的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
        }));
});
于 2012-07-04T00:43:17.180 回答