我正在尝试将旧的mongoose promise代码转换为Native ES6 Promise。我得到了catch中抛出的所有错误,我可以在控制台中记录它,但是当我尝试将它传递给响应对象时,我得到了空对象。 以下是我的代码
module.exports.login = function(req, res) {
var userPromise = User.findOne({email:req.body.email}).exec();
userPromise.then(function(user) {
if(!user){
throw new Error("step 1 failed!");
}
})
.then(function(user) {
if(!user.comparePassword(req.body.password)){
throw new Error("step 2 failed!");
}else {
return res.json({token: jwt.sign({email:user.email, name:user.name, _id: user._id}, 'SOMETOKEN')});
}
})
.catch(function(err) {
console.log('Error: '+err);
return res.status(401).send(err);
});
};
如果我走在正确的道路上,或者我在这里犯了一些错误,请告诉我。 提前谢谢。
答案 0 :(得分:1)
Error
实例是一个对象,Express将(AFAIK)使用与此类似的代码:
res.status(401).send(JSON.stringify(err))
JSON.stringify(err)
的结果为{}
,因为其主要属性(name
,message
和stack
)不可枚举。
我不确定您想要返回给用户的确切内容,但通常会发回该对象的message
属性:
return res.status(401).send({ error : err.message });
此外,您的第二个.then()
是多余的,您可以将代码缩短为:
userPromise.then(function(user) {
if (! user) {
throw new Error("step 1 failed!");
}
if (! user.comparePassword(req.body.password)) {
throw new Error("step 2 failed!");
}
return res.json({token: jwt.sign({email:user.email, name:user.name, _id: user._id}, 'SOMETOKEN')});
}).catch(function(err) {
return res.status(401).send({ error : err.message });
});
答案 1 :(得分:0)
在第一个return Promise.resolve(user)
区块的末尾添加then()
。