【问题标题】:How can I reduce this code duplication in NodeJS/Mongoose如何减少 NodeJS/Mongoose 中的代码重复
【发布时间】:2016-03-27 03:08:37
【问题描述】:

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

}

如您所见,有很多重复的代码。更改的代码是“对返回的用户做某事”部分。几乎所有其他内容(错误消息等)都保持不变。

那么,我怎样才能把这部分提取出来呢?既然这是在回调机制上工作,那有什么方法可以实现吗?

【问题讨论】:

  • 使用.update() 代替初学者。使用.findOne() 然后操作然后调用.save() 是一种非常糟糕的做法,它会占用带宽,使事情变得缓慢并且通常充满漏洞,从而导致更新的并发问题。这是一个更广泛的问题,但只要弄清楚如何正确应用该调用将节省大量样板文件并为您带来许多其他好处。

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


【解决方案1】:

一种方法是使用 Promise。这将涉及找到一种方法来将 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 的介绍,例如 "Promises - A Gentle Introduction"。对于将 Mongoose 转换为 Promise 的部分,可能有一个现有的模块,或者 API 使用的另一种方法是不将回调函数作为最后一个参数,然后返回一个 Promise。不幸的是,我对这个特定的 Mongoose API 没有确切的了解。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多