如何在 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 内发出多个“查找”请求?