我正在使用NodeJS和Mongoose作为拥有用户的应用程序。我根据请求在特定用户上执行了大量操作。
这意味着,我将这个特定的代码片段出现在很多函数中:
User.findOne({'email':req.user.email}, function (err, user) {
if (err) {
console.log('err');
res.send('Error');
}
if(!user){
console.log('err');
res.send('Error');
}
// do something with returned user
user.data = ....
...
user.save(function(err) {
if(err) {
console.log('err');
res.send('Error');
}
else {
console.log('success');
res.send('Success');
}
}
正如您所看到的,有很多代码可以复制。更改的代码是“为返回的用户执行操作”的部分'。几乎所有其他内容(错误消息等)都保持不变。
那么,我该如何提取这部分呢?由于这是在回调机制,有没有一种方法来实现这个?
答案 0 :(得分:1)
一种方法是使用Promises。它将涉及找到一种方法来转换Mongooose api以返回Promises而不是使用回调。之后,您可以创建符合
行的代码User.findOne(...)
.then((user) => {
// do something with the returned user
return user.save();
}).then(() => {
console.log('success');
res.send('Success');
}).catch(() => {
console.log('err');
res.send('Error');
});
Promises类似于传统的同步编码,您可以在其中传播类似于try-catch块的错误,因此只需要一个错误处理位置。这样您就不必在多个位置复制console.log('err'); res.send('Error');
行。
您可以在"Promises - A Gentle Introduction"中阅读Promises简介。对于将Mongoose转换为Promises的部分,可能存在一个现有模块,或者API使用的另一种方法是不将回调函数作为最后一个参数,然后返回Promise。不幸的是,我对这个特殊的Mongoose API没有确切的了解。