如何在 Express 和 Mongoose 的一个控制器 API 内发出多个“查找”请求?

Posted

技术标签:

【中文标题】如何在 Express 和 Mongoose 的一个控制器 API 内发出多个“查找”请求?【英文标题】:How to make multiple "FIND" request inside one controller API in express and Mongoose? 【发布时间】: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 调用和响应,但在控制器中请求不同的数据,创建一个对象并将其发送回。

【问题讨论】:

【参考方案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 看起来更清晰。

【讨论】:

以上是关于如何在 Express 和 Mongoose 的一个控制器 API 内发出多个“查找”请求?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Express 和 NodeJS 中针对 Mongoose 错误进行错误处理。

如何填充递归模式引用 Mongodb、Mongoose、Express?

如何在本地使用带有 express 的 graphql 和带有 mongoose 的 mongodb 来检索文档?

如何在 Express 和 Mongoose 的一个控制器 API 内发出多个“查找”请求?

您如何在 Node.js + Express + Mongoose + Jade 中处理表单验证,尤其是嵌套模型

如何使用 Mongoose、Express、Angular 4 和 NodeJS 上传/保存和显示图片