如何在NodeJS / Mongoose中减少此代码重复

时间:2016-03-27 03:08:38

标签: node.js mongodb mongoose callback code-duplication

我正在使用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');
 }

}

正如您所看到的,有很多代码可以复制。更改的代码是“为返回的用户执行操作”的部分'。几乎所有其他内容(错误消息等)都保持不变。

那么,我该如何提取这部分呢?由于这是在回调机制,有没有一种方法来实现这个?

1 个答案:

答案 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没有确切的了解。