javascript - Nodejs + Mongoose 中的异步/等待

标签 javascript node.js express mongoose async-await

我是 Promises 和异步/等待编程的新手,我不确定我是否明白。我正在 Nodejs 中使用 Express、Mongoose 和 MongoDB 创建一个 API。 我看过很多关于如何处理异步性的教程,但它们都是关于 NodeJs 项目的,其中路由和数据库查询位于同一个文件中。 示例:

const asyncMiddleware = fn =>
  (req, res, next) => {
    Promise.resolve(fn(req, res, next))
      .catch(next);
};

router.get('/users/:id', asyncMiddleware(async (req, res, next) => {
    const something = await getSomethingFromDb({ id: req.params.id })
    res.json(something);
}));

但是,为了清楚起见,我已将路由与 Controller 分开,但我严重怀疑我是否正确地完成了它。这是我的代码:

router.js

const asyncMiddleware = fn =>
  (req, res, next) => {
    Promise.resolve(fn(req, res, next))
      .catch(next);
};

router.get('/something/:id', asyncMiddleware(async (req, res, next) => {
    const answer = await somethingController.findById(req, res, next)
}));

controller.js

exports.findById = async (req, res, next) => {
    const something = await Something.findById(req.params.id).exec();
    res.send(something);
};

我尝试使用 console.log() 来检查打印的内容,但我意识到,由于等待部分,整段代码将等待查询完成。 这实现得好吗?我该如何测试它?

版本: NodeJs v10.16.3 Mongoose v5.7.1

最佳答案

首先,您不需要“asyncMiddleware”。让我给出一个完整的示例,说明如何分离路由和 Controller ,同时保持 Controller 异步:

Controller

exports.findById = async (req, res, next) => {
    try{
       const something = await Something.findById(req.params.id).exec();
        return res.send(something);
    }catch(err){
       return res.status(500).send({
        message: err.message
      })
    }   
};

您应该将 async 调用包装在 try/catch block 中。

路线

然后,您只需在 route 调用 Controller ,如下所示:

router.get('/:id', Controller.findByID)

就是这样。您的路线上不需要任何额外的异步调用。

如果你有中间件想要添加你的路由,你可以这样做:

//for single middleware
router.get('/:id',somethingMiddle,Controller.findByID)

//for multiple middleware
router.get('/:id',[somethingMiddle, anotherMiddle],Controller.findByID)

请告诉我这是否有帮助

关于javascript - Nodejs + Mongoose 中的异步/等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58189365/

相关文章:

Java post http 请求(express)REST api

javascript - 单击按钮时如何避免刷新asp.net中的文本框值?

javascript - 使用Object.create实现继承时改变值的问题

javascript - NodeJS 请求 POST Iconv

Node.js/Express 本地磁盘缓存

javascript - Node.JS - 无法从 package.json 跨脚本导出环境变量

javascript - 在 NodeJs 中使用 tedius 和 sequelize 的 SQL Server 连接

node.js - ExpressJS 删除连接

Javascript onkeyup 也是 "slow"吗? .hide() 仅适用于 onkeydown

javascript - Jquery $.post 未按预期工作