gpt4 book ai didi

javascript - 如何使用 Express 从一个端点发送多个查询?

转载 作者:太空宇宙 更新时间:2023-11-04 02:50:35 25 4
gpt4 key购买 nike

我试图多次查询我的数据库并构造一个对象,该对象将数据库中的每个响应存储在一个字段中。这是我的代码:

router.post('/search', (req, res) => {
var collection = db.get().collection('styles')
var data = [];

collection.distinct('make.name', (err, docs) => {
data.push({'make': docs });
});

collection.distinct('model', (function (err, docs) {
data.push({'model': docs });
}))

res.send(data);
});

由于 NodeJS/Express 是异步的,因此这并不像我希望的那样工作。如何重建此端点以进行多个数据库调用(来自同一集合)并返回包含它的对象?

最佳答案

有不止一种方法可以做到这一点:

嵌套回调

如果没有 promise ,您可以嵌套回调:

router.post('/search', (req, res) => {
var collection = db.get().collection('styles')
var data = [];

collection.distinct('make.name', (err, docs) => {
if (err) {
// ALWAYS HANDLE ERRORS!
}
data.push({'make': docs });
collection.distinct('model', (function (err, docs) {
if (err) {
// ALWAYS HANDLE ERRORS!
}
data.push({'model': docs });
res.send(data);
}))
});
});

这将是最简单的方法,但请注意,如果这两个请求可以并行完成,则效率不高。

异步模块

您可以使用async模块:

router.post('/search', (req, res) => {
var collection = db.get().collection('styles')
var data = [];

async.parallel({
make: cb => collection.distinct('make.name', cb),
model: cb => collection.distinct('model', cb),
}, (err, responses) => {
if (err) {
// ALWAYS HANDLE ERRORS!
}
data.push({'make': responses.make });
data.push({'model': responses.model });
res.send(data);
});
});

参见:https://caolan.github.io/async/docs.html#parallel

但这可能仍然不是最方便的方法。

ES2017 异步/等待

如果您要调用 30 个电话,最灵活的方法是:

  1. 使用返回 Promise 的函数,而不是接受回调的函数
  2. 如果可以的话,请使用 async/await,或者至少使用基于生成器的协程
  3. 当逻辑需要按顺序运行时,等待 Promise(或 Yield Promise)
  4. 使用 Promise.all() 来完成任何可以并行完成的事情

使用 async/await 您的代码可能如下所示:

    // in sequence:    
var make = await collection.distinct('make.name');
var model = await collection.distinct('model');
// use 'make' and 'model'

或者:

    // in parallel:
var array = await Promise.all([
collection.distinct('make.name'),
collection.distinct('model'),
]);
// use array[0] and array[1]

async/await 的一大优点是错误处理:

try {
var x = await asyncFunc1();
var array = await Promise.all([asyncFunc2(x), asyncFunc3(x)]);
var y = asyncFunc4(array);
console.log(await asyncFunc5(y));
} catch (err) {
// handle any error here
}

您只能在使用 async 关键字创建的函数内部使用它。欲了解更多信息,请参阅:

有关浏览器的支持,请参阅:

有关 Node 中的支持,请参阅:

在没有对 asyncawait 原生支持的地方,您可以使用 Babel:

或者使用稍微不同的语法,基于生成器的方法,如co或Bluebird协程:

查看这些答案以获取更多信息:

关于javascript - 如何使用 Express 从一个端点发送多个查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43326470/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com