2017-08-14 326 views
0

我有一個奇怪的Redis行爲:節點的Redis:準備檢查失敗 - NOAUTH需要驗證

const redis = require('redis'); 
const { REDIS_URL: redisUrl, REDIS_PASSWORD: redisPassword } = process.env; 

const client = redis.createClient(redisUrl, { 
    no_ready_check: true, 
    auth_pass: redisPassword 
}); 

client.on('connect',() => { 
    redisPassword && client.auth(redisPassword); 
}); 

client.on('error', err => { 
    global.console.log(err.message) 
}); 

但一切的時候,我收到以下錯誤:

throw er; // Unhandled 'error' event

ReplyError: Ready check failed: NOAUTH Authentication required.

爲什麼未處理?我錯誤處理程序
爲什麼準備檢查失敗?我已禁用它在選項

回答

0

我不知道爲什麼你的代碼會拋出這個錯誤。但我在我的本地機器上試用這個代碼,它運行良好。

const redis = require('redis'); 
const redisPassword = "password" ; 
const client = redis.createClient({ 
      host : '127.0.0.1', 
      no_ready_check: true, 
      auth_pass: redisPassword,                                       
});        

client.on('connect',() => { 
      global.console.log("connected"); 
});        

client.on('error', err => {  
      global.console.log(err.message) 
});        

client.set("foo", 'bar');   

client.get("foo", function (err, reply) { 
     global.console.log(reply.toString()) 
}) 

和運行節點client.js將輸出:

connected

bar

NOAUTH需要驗證通過時redis的處理命令時,它發現客戶端沒有通過認證,因此與它抱怨引起的。

我想也許你給createClient的redisUrl有一些問題,試着去調試它,或者改成我的代碼的方式來嘗試。希望你能解決它。

還有一件事:client.auth(redisPassword)不是必須的,因爲如果你設置了auth_pass或password選項,redis客戶端會在任何命令之前自動發送auth命令給服務器。

+0

感謝您使用auth_pass選項的建議。這很有用。至於這個問題 - 我用redis重新創建了一個實例(我們在它的引擎蓋下使用了flynn和heroku)現在它起作用了 –