2011-12-02 66 views
0

我試圖讓IODocs在Heroku上運行。它需要node.js和Redis。無可否認,我是所有這些技術的新手。儘管如此,我已經設法讓它在本地運行。但是,在部署到Heroku時收到以下錯誤。node.js和Redis在Heroku中用於IODocs

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:[email protected]: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的調試線和錯誤,我敢肯定,這是一個配置問題。但不知道如何解決它。任何幫助是極大的讚賞。

回答

1

這確實與Redis在Heroku上的配置有關。還有其他行需要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 JongboomKirsten Jones幫助我開始。另外,我相信該項目已經在GitHub上進行了更新,以包括Heroku配置。但是,我還沒有測試它。

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:[email protected]:9030/。你可以嘗試手動連接到該網址,看看是否有效?

+0

我給它一個鏡頭。這很奇怪,因爲我的* Redis To Go *調試行顯示了正確的配置,並且位於同一個塊中。 –

+0

這是一個超級先進的技巧。在[Cloud9 IDE](http://c9.io)中打開它(可以通過Git repo來做到這一點),以便實際上可以將調試器放在它上面並檢查變量。在這種情況下節省大量時間。您現在仍然可以連接到與您的連接相同的Redis實例。 –

+0

我會檢查一下。問題是我目前還不知道這些技術。儘管我可以確定問題,但我甚至不知道如何編寫代碼來連接到Redis。 –

0

我其實有一篇關於如何讓IODocs在Heroku上工作的博客文章。它需要進行配置更改,以使REDIS能夠與IODoc一起在Heroku上工作。

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

這裏是需要的代碼更改: 添加以下塊下的「VAR分貝;」對應用程序的:

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

是的,我知道。如果你看我的問題,我引用了你的文章。但是,您的建議配置不起作用。我能夠解決這個問題,並在幾周前回復你的帖子。我想你從來沒有批准我的評論:) –

+0

是的,我做了,並編輯帖子添加我添加的作品(這是與你有點不同)。很高興我得到它的工作:-) –

+0

我偏愛我的解決方案:)它比你的邏輯掛鉤少。謝謝你讓我開始。我主要使用你的寫作,直到代碼更改。在過去的幾天裏,我已經寫了一篇關於I/O Docs的博客文章,因爲您的日期已過,我的評論尚未獲得批准。 –

0

最近,更簡潔的方法是使用redis-url模塊來處理配置。

我是personnaly使用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 
     })); 
}); 
+0

我從[Heroku Docs](https://devcenter.heroku.com/articles/nodejs#using_redis)讀取了相同的內容。我這樣做是因爲'config'在I/O Docs的其他地方使用。這是更新代碼而不用在任何地方包裝條件的更簡潔的方法。但是,如果我正在爲Heroku創建一個新應用程序,我會按照自己的方式進行操作。 –