【问题标题】:node js callback ambiguity节点js回调歧义
【发布时间】:2014-11-23 05:39:54
【问题描述】:

我正在尝试将 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 [本地主机] :3000/api/Kendra_Loud 第一个实例返回正确的数据,但是,第二个返回 null。为什么将正在执行工作的代码移动到导致问题的不同函数?在第二部分中访问客户端时,“res”似乎也超出了范围,但在第一部分中并非如此。 谁能解释一下我在这里缺少什么。提前致谢。

【问题讨论】:

  • 您确定您的第二个示例返回null 和正确的数据集,并且您已按原样显示代码吗?您是否看到您从未更改 value 变量的值(在为其分配一个空对象之后),而是在您的响应中发送它?
  • 是的,问题不在于范围,而在于时间:res.jsonp() 将在 client.get 完成其工作之前被调用。

标签: node.js redis


【解决方案1】:

在发送响应之前,您无需等待异步 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 前缀来创建全局变量。

【讨论】:

  • 嗯,您在控制台中看到Error encountered! 了吗?
猜你喜欢
  • 2018-06-10
  • 2018-07-15
  • 1970-01-01
  • 1970-01-01
  • 2021-07-30
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多