2014-11-22 84 views
1

我正在嘗試使用redis和nodejs。節點js回調不明確

此代碼工作正常:


express = require('express'); 
app = express(); 
logger = require('express-logger'); 
app.use(logger({path: "/home/debanjan/Documents/nodejs/project1/logfile.txt"})); 

var redis = require('redis'); 
var client = redis.createClient(); 
client.on("error", function (err) { 
    console.log("Error " + err); 
}); 

app.get(function(req,res,next){ 
console.log("Date " + Date.now() + " :: Time " + Time.now()); 
next(); 
}) 

app.get('/api/:name',function(req,res){ 
res.status(200); 
res.set('Content-Type', 'text/plain'); 
client.get(req.params.name , function(err,data){ 
     if(err){ 
      console.log("Error encountered!"); 
     }else{ 
      console.log("Value fetched ..." + data); 
      res.jsonp({"result": data});  
      res.send(); 
     } 
    }); 
}); 

app.listen(3000,function(){ 
console.log("Ready to launch..."); 
}); 

然而,這是沒有的。


express = require('express'); 
app = express(); 
logger = require('express-logger'); 
app.use(logger({path: "/home/debanjan/Documents/nodejs/project1/logfile.txt"})); 

var redis = require('redis'); 
var client = redis.createClient(); 
client.on("error", function (err) { 
    console.log("Error " + err); 
}); 

app.get(function(req,res,next){ 
    console.log("Date " + Date.now() + " :: Time " + Time.now()); 
    next(); 
}) 

app.get('/api/:name',function(req,res){ 
res.status(200); 
res.set('Content-Type', 'text/plain'); 
fetchFromDb(req.params.name,res); 
}); 

app.listen(3000,function(){ 
    console.log("Ready to launch..."); 
}); 

function fetchFromDb(name,res){ 
    console.log("Key given : [" + name+"]"); 
    value = new Object; 
    client.get(name,function(err,data){ 
     if(err) 
     console.log("Error encountered!"); 
     console.log("Value fetched ..." + data); 
    }); 

    res.jsonp({"result": value}); 
    res.send(); 
} 

當我做了捲髮: 捲曲-i [本地主機]:3000/API/Kendra_Loud 第一實例返回正確的數據,但是,第二個返回null。爲什麼要將執行該工作的代碼轉移到導致該問題的其他功能?在第二部分中,當訪問client.get內部時,「res」似乎超出了範圍,但是在第一部分中卻不是這樣。 任何人都可以請解釋我在這裏失蹤。提前致謝。

+0

你確定你的第二個例子返回'null'和正確的一組數據,並且你已經顯示了代碼?你是否發現你永遠不會改變'value'變量的值(在分配一個空對象之後),然後在你的迴應中發送它? – raina77ow 2014-11-22 21:39:15

+0

是的,問題不是範圍,而是時間:調用'res.jsonp()'_before_'client.get'完成它的工作。 – raina77ow 2014-11-22 21:40:24

回答

0

在發送回覆之前,您並未等待異步client.get()完成。更改fetchFromDb()功能是這樣的:

function fetchFromDb(name,res){ 
    console.log("Key given : [" + name+"]"); 
    client.get(name,function(err,data){ 
     if(err) 
     console.log("Error encountered!"); 
     console.log("Value fetched ..." + data); 
     res.jsonp({"result": data}); 
    }); 
} 

此外,你應該避免用var前綴變量聲明創建全局。

+0

我曾試過,沒有成功。 – 2014-11-22 21:49:11

+0

那你有沒有在控制檯上看到'遇到錯誤! – mscdex 2014-11-22 22:06:54

+0

沒有錯誤,只是空的迴應。 – 2014-11-22 22:53:48