Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
此对象的可选Javascript_Javascript_Node.js - Fatal编程技术网

此对象的可选Javascript

此对象的可选Javascript,javascript,node.js,Javascript,Node.js,我有一个简单的函数,它路由HTTP查询模式,查询redis并发送响应。下面是代码 router.get('/getinfo/:teamname', function main(teamname) { rclient.hgetall(teamname,function(err,obj){ console.log("the response from redis is ",obj) cache.put(eventname,obj); consol

我有一个简单的函数,它路由HTTP查询模式,查询redis并发送响应。下面是代码

router.get('/getinfo/:teamname', function main(teamname) {

  rclient.hgetall(teamname,function(err,obj){
        console.log("the response from redis is ",obj)
        cache.put(eventname,obj);
        console.log("inserting to cache");  
        this.res.end(obj); // this object is root cause for all problems
    });
}

路由器对象afaik使用
this.res.end(obj)
发送响应。我想,因为我试图在我的redis客户端中执行此操作,所以我遇到了错误。是否有其他方法将值作为响应发送?我考虑使用基于发射器的模型,其中通道发出响应,侦听器得到响应。但这似乎是解决这个问题的一种迂回的方法。有更简单的方法吗?

错误可能是因为,当您尝试使用
时,它没有预期的值——一个具有
res
属性的对象,而该属性又具有
end()
方法

这是因为JavaScript中的每个
函数
都有自己的
this
和自己的值。并且,当嵌套
函数
s时,使用
将返回最接近的
函数
的值(即)

要解决此问题,可以将预期值保存到局部变量:

router.get('/getinfo/:teamname', function main(teamname) {
    var request = this;

    rclient.hgetall(teamname,function(err,obj){
        // ...
        request.res.end(obj);
    });
});
或者,匿名回调,因此两个
函数
都必须具有相同的
值:

router.get('/getinfo/:teamname', function main(teamname) {
    rclient.hgetall(teamname, function(err,obj){
        // ...
        this.res.end(obj);
    }.bind(this));
});

res
在任何附带的函数中都可用吗?记住javascript是同步的。因此,回调中的
这个
可能不是
这个
你,除非是它。也许它是从
rclient
对象内部引用
this
。它救了我一天。。!非常感谢!