2012-06-21 95 views
3

我正試圖將一個Redis數據庫與一個Node.js應用程序連接起來,以便能夠存儲有關項目的註釋。我正在使用node_redis庫來處理連接。當我嘗試從數據庫中檢索註釋時,只返回「[true]」。出於測試的目的,我將所有東西都塞進了一個方法中,並且我已經對這些值進行了硬編碼,但我仍然收到「[true]」。Node.js和Redis

exports.getComment = function (id){ 

var comments = new Array(); 

rc.hmset("hosts", "mjr", "1", "another", "23", "home", "1234"); 

comments.push(rc.hgetall("hosts", function (err, obj) { 

    var comment = new Array(); 

    if(err){ 
     comment.push("Error"); 
    } else { 
     comment.push(obj); 
    } 

    return comment; 
})); 

return comments; 

} 

根據教程更新的代碼,這裏是結果:

檢索評論:

exports.getComment = function (id, callback){ 

    rc.hgetall(id, callback); 

} 

添加評論:

exports.addComment = function (id, area, content, author){ 

//add comment into the database 
rc.hmset("comment", 
     "id", id, 
     "area", area, 
     "content", content, 
     "author" , author, 
     function(error, result) { 
      if (error) res.send('Error: ' + error); 
     }); 

//returns nothing 

}; 

守則渲染:

var a = []; 
require('../lib/annotations').addComment("comment"); 
require('../lib/annotations').getComment("comment", function(comment){ 
    a.push(comment) 
}); 
res.json(a); 
+0

克里斯Maness直言不諱:請更新您的問題,不是我的答案:) –

回答

0

當對addComment的調用如下所示時,問題出現在實際的Redis-Node庫中。

require('../lib/annotations').getComment("comment", function(comment){ 
    a.push(comment) 
}); 

此調用在回調函數中缺少參數。第一個參數是錯誤報告,如果一切正常,應該返回null,第二個參數是實際數據。所以它應該像下面的調用那樣構造。

require('../lib/annotations').getComment("comment", function(comment){ 
    a.push(err, comment) 
}); 
2

Node.js是異步。這意味着它會異步執行redis內容,然後將結果返回到回調函數中。

我建議你閱讀本教程,並進一步獲得前要充分了解它:http://howtonode.org/node-redis-fun

基本上,這種方式行不通:

function getComments(id) { 
    var comments = redis.some(action); 
    return comments; 
} 

但它必須是這樣的:

function getComments(id, callback) { 
    redis.some(action, callback); 
} 

這樣,您使用這樣的API:

getComments('1', function(results) { 
    // results are available! 
}); 
+0

換句話說,返回的意見再來評論 – ControlAltDel

+0

之前發生的事情,'return'發生之前的數據都是甚至設置(我敢肯定'當返回完成時,hmset沒有完成)。 –

+0

那麼如何確保hmset發生在hmget之前 –