如何减lessNodeJS / Mongoose中的代码重复

我正在使用NodeJS和Mongoose来获得有用户的应用程序。 而且,根据请求,服务器对特定用户执行大量操作。

这意味着,我有这个特殊的代码片段出现在很多function:

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'); } 

}

正如你所看到的,有很多复制的代码。 改变的代码是“用返回的用户做某事”的部分。 几乎所有其他(错误消息等)保持不变。

那么,我怎样才能把这部分提取出来呢? 既然这是在callback机制上工作,是否有一定的方法来实现呢?

一种方法是使用承诺。 这将涉及find一种方法来转换Mongooose API返回Promises而不是使用callback。 在那之后,你可以创build一些代码

 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'); }); 

Promise类似于传统的同步编码,您可以传播类似于try-catch块的错误,因此只需要一个error handling位置。 这样你就不必复制console.log('err'); res.send('Error'); console.log('err'); res.send('Error'); 线在多个地方。

你可以阅读承诺介绍,例如“承诺 – 一个温柔的介绍” 。 对于将Mongoose转换为Promise的部分,可能有一个现有的模块,或者API使用的另一种方法是不将callback函数作为最后一个参数,然后返回Promise。 不幸的是,我对这个特定的Mongoose API没有确切的知识。

Interesting Posts