坚持将 Node/Mongo 代码从回调函数重构为 Promises

Stuck on refactoring Node/Mongo code from callback functions to Promises

我在node.js写了一个项目,其中异步是通过回调函数实现的。但是,我后来了解了 Promises 和 async/await。重构项目代码以便我将所有回调函数替换为 async/await 是否是最佳实践?

无论如何,作为对自己的训练,我决定先重构 Promises,然后再重构 async/await。但是,我对重构承诺有一些疑问。

现在,下面的示例并没有真正包含太多 'callback hell' 的内容,因此您可能认为重构 promises 并不是真正必要的,但我故意从一个直接的示例开始。我代码的其他部分确实包含回调地狱。

所以这里是我的一个项目中使用的回调函数的例子。当用户选择他们的一篇博文并单击 'delete' 时,将运行以下代码(BlogPost 是数据库集合)

app.post('/users/login', =(req, res)=>{
    BlogPost.findByIdAndDelete(req.body.idOfPostToBeDeleted, (err, blogpost)=>{
    res.redirect('/');
    console.log(err, blogpost)  
    });
});

到目前为止,我是这样重构的。

app.post('/users/login', (req,res)=>{
    BlogPost
      .findByIdAndDelete(req.body.idOfPostToBeDeleted)
        .then(
        ()=>{res.redirect('/')})
        .catch((error)=>{console.log(error)})
      ;
      }

它似乎按预期工作,但我觉得我没有正确完成,主要是因为我没有创建 Promise 构造函数。所有关于此的教程都包括承诺构造函数

为什么这在没有 promise 构造函数的情况下工作?

如果 'then' 关键字没有 promise 构造函数会怎样?

这里的最佳做法是什么?

我应该创建一个 promise 构造函数吗?看起来究竟是什么样的代码?

我认为 findByIdAndDelete 足够智能,可以 return 如果您不指定回调,则可以使用 Promise。

这就是为什么您不需要构建 Promise。我觉得你的做法还可以。

为了提高可读性,大多数人更愿意使用 async await 编写此代码:

app.post('/users/login', (req,res)=> {
  async (req,res)=>{
    try{
      const result = await BlogPost.findByIdAndDelete(req.body.idOfPostToBeDeleted)
      res.redirect('/')
    } catch(e)
    {
      console.log(error)
    }
  }
}