iodocsのHerokuのnode.jsとRedis
質問
私はヘロクでヨードクを走らせようとしています。 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 デバッグラインと エラー, 、これは構成の問題だと確信しています。しかし、それを修正する方法がわからない。どんな助けも大歓迎です。
解決 2
これは確かに、HerokuのRedisの構成に関係していました。 i/o docs app.jsで更新を必要とする追加の行がありました。
最終的に、私はグローバルを豚に袋に入れました config
生産(Heroku)環境を嗅いだ後、上部(〜line 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ドキュメントを実行するために必要な他の変更が含まれます。このプロジェクトに興味がある場合は、レビューすることをお勧めします。
ありがとう Jan Jongboom と キルステン・ジョーンズ 私が始めるのを手伝ってくれた。さらに、プロジェクトはGitHubで更新され、Heroku構成を箱から出して含めると思います。しかし、私はまだそれをテストしていません。
他のヒント
この行によると:
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に手動で接続して、それが機能するかどうかを確認できますか?
私は実際に、Herokuに取り組んでいるIodocsを取得する方法についてのブログ投稿をしています。 Redisが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);
}
そして、これは、構成ファイルを読み取った後、[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;
}
最近、よりクリーンな方法は Redis-url 構成を処理するモジュール。
私はレディス(Redis to Go Addon経由で)をセッションストアとしてExpressを使用していますが、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
}));
});