这是登录的过程,如果user为空返回{"status":-1,"msg":"Username Not exists"}
现在user为null的时候,会报错,TypeError: Cannot read property 'password' of null
很明显是继续执行了 if(user.password != password)
这句话。
但是如果我把密码判断这三行注释掉,却不会继续执行res.json({"status":1})
.
我就非常困惑了,res.json()
后面的代码到底是执行还是不执行啊 ??
User.get(username,function(err,user){
if(!user){
console.log("Error");
res.json({"status":-1,"msg":"Username Not exists"});
}
if(user.password != password){
res.json({"status":-1,"msg":"Password Error"});
}
res.json({"status":1});
})
这个问题很难么。。大神们给个力点醒我啊!
加个 return
在res.json({“status”:1});前加console.log(‘333333’);看看能不能输出333333,如果能 说明它会执行,看看是不是其他地方有错误
最底部加上console.log(‘xx’)是可以输出的,但是在express的send和json输出响应体的时候,如果有两个连续的输出,默认只是第一个,如果在原生node的处理,加入res.write()里面的字节数在ff中没超过0.5kb和在chrome中没有超过1kb都会拼接起来的
最后一句代码是会运行的,但是内容不会写回。这个要从express源码查原因,res.json最后调用的是res.send返回,我摘入了一些res的源码内容:
...
var res = module.exports = {
__proto__: http.ServerResponse.prototype
};
...
res.send = function(body){
...
// respond
this.end(head ? null : body);
return this;
};
最后是通过ServerResponse.prototype.end返回的,可以预计这个方法是会把socket给关闭(没有去继续追源码了,要详细了解可以去追查nodejs的源码),这就是为什么后面一句res.json不会返回(注意代码是运行的!)。
所以最好的写法是在前两个res.json后加上return
if(!user){
console.log("Error");
res.json({"status":-1,"msg":"Username Not exists"});
return;
}
if(user.password != password){
res.json({"status":-1,"msg":"Password Error"});
}
我目前是这么办的。 加return 总感觉有点繁琐 = =! 人懒
嗯,他应该是继续向下执行的。 我感觉res.json() 要是有return的功效就爽多了
Yes 现在是这么办的 ^ .^
原来是这样,受教了
现在就是加了return。 看你贴的源码,res.send() 貌似是有return的功效啊。
send貌似发送json也是可行的,下班回家试试。哈哈
多谢啦~
在不同的function里面return是不一样的。 我前面的写的太急,没有写好可能会有些误解(写回和返回不一样,注意socket的关闭)。不过你仔细按照那个思路理解下。
现在好像带 return 功能了呢