【问题标题】:How to make multiple "FIND" request inside one controller API in express and Mongoose?如何在 Express 和 Mongoose 的一个控制器 API 内发出多个“查找”请求?
【发布时间】:2020-11-09 04:51:00
【问题描述】:

我有一个 API 可以查询数据库中的数据。所以我想对猫鼬进行多个“查找”查询,加入所有响应并从查询中发回结果。我正在使用 Nodejs 和 Express 来制作 API 和 Mongoose。

exports.data = (req, res) => {
    //FIND ALL CONSULTATIONS FILTERED BY STATUS
    const result1 = Model.find({ status: 'STATUS1' }).exec(
        (err, item) => {
            if (err) {
                return res.status(400).json({
                    error: 'Erorr en STATUS1',
                });
            }
            
        }
    );
    const result2 = Model.find({ status: 'STATUS2' }).exec(
        (err, item) => {
            if (err) {
                return res.status(400).json({
                    error: 'Erorr en STATUS2',
                });
            }
        }
    );


    res.json({result1, result2})

};

类似的东西,但它不起作用。我怎样才能做到这一点?只进行一次 API 调用和响应,但在控制器中请求不同的数据,创建一个对象并将其发送回。

【问题讨论】:

    标签: node.js rest express mongoose mongodb-query


    【解决方案1】:

    您当前的问题是节点将开始第一次查找,在完成之前它将开始第二次查找,并且在其中任何一项完成之前它会发回可能是{ result1: undefined, result2: undefined }的结果

    您需要等待结果才能发回。

    您的选择是回调地狱、承诺或异步等待。选择你的毒药。

    // callback hell
    Model.find({ status: 'STATUS1' }).exec((err, result1) => {
      if (err) {
        return res.status(400).json({
          error: 'Erorr en STATUS1'
        })
      }
      Model.find({ status: 'STATUS2' }).exec((err, result2) => {
        if (err) {
          return res.status(400).json({
            error: 'Erorr en STATUS2'
          })
        }
        res.json({ result1, result2 })
      })
    })
    
    // Promises
    exports.data = async (req, res) => {
      //FIND ALL CONSULTATIONS FILTERED BY STATUS
      const promise1 = Model.find({ status: 'STATUS1' }).exec()
      const promise2 = Model.find({ status: 'STATUS2' }).exec()
      Promise.all([promise1, promise2])
        .then(([result1, result2]) => {
          res.json({ result1, result2 })
        })
        .catch(err => {
          return res.status(400).json({
            error: 'Erorr en STATUS2'
          })
        })
    }
    
    // Async Await
    exports.data = async (req, res) => {
      //FIND ALL CONSULTATIONS FILTERED BY STATUS
      let result1
      let result2
      try {
        result1 = await Model.find({ status: 'STATUS1' }).exec()
      } catch (err) {
        return res.status(400).json({
          error: 'Erorr en STATUS1'
        })
      }
      try {
        result2 = await Model.find({ status: 'STATUS2' }).exec()
      } catch (err) {
        return res.status(400).json({
          error: 'Erorr en STATUS2'
        })
      }
      res.json({ result1, result2 })
    }
    

    以上代码均未经过测试。只是给你一个粗略的想法。

    虽然 promise 在这里看起来更简洁,但我几乎总是尽可能选择使用 async/await。由于这是 express,因此使用 express 样式的错误处理程序(并排除 try-catch)是有意义的,这将使 async-await 看起来更清晰。

    【讨论】:

      猜你喜欢
      • 2018-04-18
      • 2015-04-15
      • 1970-01-01
      • 2019-12-11
      • 1970-01-01
      • 1970-01-01
      • 2022-08-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多