我有一个登录用户的函数,它应该返回JSON。
const username = req.body.username;
const password = req.body.password;
if (!username) {
throw new Error('Missing username');
}
if (!password) {
throw new Error('Missing password');
}
User.findOne({ username, password }).then(user => {
res.json({ user });
}).catch(err => {
res.json({ err });
});但是在JSON中不会返回缺少用户名或缺少密码的错误。
我可以把它改成
const username = req.body.username;
const password = req.body.password;
if (!username) {
res.json({ err: 'Missing username' });
}
if (!password) {
res.json({ err: 'Missing password' });
}
User.findOne({ username, password }).then(user => {
res.json({ user });
}).catch(err => {
res.json({ err });
});但这看起来有点多余。
正确的做法是将其封装在promise中吗?
发布于 2017-09-11 17:17:24
在您的第一个解决方案中,抛出的错误将不会被处理,因为您将它们抛出promise链之外,并且没有try/catch块。在第二个解决方案中,您可能会得到cannot send headers after they sent错误,因为响应可以发送两次(缺少username和缺少password )。
因此,这里可能的解决方案之一是创建一个promise链(使用Promise.resolve())并在此处验证参数:
function validateParams() {
const username = req.body.username;
const password = req.body.password;
if (!username) {
throw new Error('Missing username');
}
if (!password) {
throw new Error('Missing password');
}
return { username, password };
}
Promise
.resolve()
.then(validateParams)
.then(filter => User.findOne(filter))
.then(user => res.json(user))
.catch(err => res.json(err));发布于 2017-09-11 16:59:31
最明显的方法确实是将它们封装在promise中以启动您的promise链( User.findOne位于第一个then-block中)-这样您当前的错误处理程序就可以很好地捕获它们。
发布于 2017-09-11 17:01:30
您可以将您的函数包装在promise中,并有效地处理它
function getRes(){
return new Promise(function(resolve, reject){
const username = req.body.username;
const password = req.body.password;
if (!username) {
reject(new Error('Missing username'));
}
if (!password) {
reject(new Error('Missing password'));
}
resolve(User.findOne({ username, password }));
});
}
getRes().then(function(result){
res.json(result);
}).catch(function(err){
res.json(err);
})https://stackoverflow.com/questions/46151685
复制相似问题