0

HerokuでIODocsを実行しようとしています。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のデバッグ行とエラーの違いから、これは構成の問題であると確信しています。しかし、それを修正する方法がわかりません。どんな助けでも大歓迎です。

4

4 に答える 4

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 に答える
1

これは確かに、HerokuでのRedisの構成と関係がありました。I / ODocsapp.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ドキュメントをインストール、構成、および展開するためのブログ投稿を作成しました。これには、これと、I/Oドキュメントの実行に必要なその他の変更が含まれています。このプロジェクトに興味がある場合は、レビューすることをお勧めします。

私が始めるのを手伝ってくれたJanJongboomKirstenJonesに感謝します。さらに、プロジェクトはGitHubで更新され、Heroku構成がすぐに含まれるようになっていると思います。しかし、私はまだそれをテストしていません。

于 2012-01-15T00:30:50.473 に答える
0

私は実際に、IODocsをHerokuで動作させる方法についてのブログ投稿を持っています。REDISをIODocsを使用してHerokuで動作させるために必要な構成変更があります。

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

必要なコード変更は次のとおりです。「vardb;」の下に次のブロックを追加します。アプリへ:

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

そして、構成ファイルを読んだ後、「API構成のロード」セクションでこれを行います。

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モジュールを使用することです。

私は個人的にExpresswithRedis(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 に答える