我正在尝试将redis与nodejs一起使用。
此代码运行正常:

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();
}

当我做卷发时:
curl-i[localhost]:3000/api/kendra_oud
第一个实例返回正确的数据,但是第二个实例返回空值。为什么要将正在执行工作的代码移到另一个函数会导致此问题?此外,在客户端内部访问时,“res”似乎超出了范围。请进入第二部分,但在第一部分中并非如此。
有人能解释一下我在这里遗漏了什么吗?提前谢谢。

最佳答案

在发送响应之前,您不会等待异步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

关于node.js - node js回调歧义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27082762/

10-11 17:41