gpt4 book ai didi

javascript - wait 仅在异步函数中有效 - nodejs

转载 作者:行者123 更新时间:2023-12-01 01:03:48 24 4
gpt4 key购买 nike

我正在使用 Node 和 Express 为我的应用程序创建服务器。这就是我的代码的样子:

async function _prepareDetails(activityId, dealId) {

var offerInfo;
var details = [];


client.connect(function(err) {
assert.equal(null, err);
console.log("Connected correctly to server");

const db = client.db(dbName);
const offers_collection = db.collection('collection_name');

await offers_collection.aggregate([
{ "$match": { 'id': Id} },
]).toArray(function(err, docs) {
assert.equal(err, null);
console.log("Found the following records");
details = docs;
});
})
return details;
}

app.post('/getDetails',(request,response)=>{

var Id = request.body.Id;
var activityId = request.body.activityId;
_prepareDetails(activityId,Id).then(xx => console.log(xx));
response.send('xx');
})

在调用 getDetails API 时,我得到了

await is only valid in async function error (At line await offers_collection.aggregate)

在声明异步函数时,我也得到了红色下划线。我使用的 Node 版本是11.x。我也在使用 firebase API。我在这里做错了什么?

最佳答案

您的函数之一缺少异步声明。这是工作代码:

async function _prepareDetails(activityId, dealId) {

var offerInfo;
var details = [];


client.connect(async function(err) {
assert.equal(null, err);
console.log("Connected correctly to server");

const db = client.db(dbName);
const offers_collection = db.collection('collection_name');

await offers_collection.aggregate([
{ "$match": { 'id': Id} },
]).toArray(function(err, docs) {
assert.equal(err, null);
console.log("Found the following records");
details = docs;
});
})
return details;
}

app.post('/getDetails', async (request,response)=>{

var Id = request.body.Id;
var activityId = request.body.activityId;
let xx = await _prepareDetails(activityId,Id);
response.send('xx');
})

Await 只能在异步函数中使用,因为根据定义,await 是异步的,因此必须使用回调或 Promise 范例。通过将函数声明为异步,您就是在告诉 JavaScript 将您的响应包装在 Promise 中。您的问题在以下行:

  client.connect(function(err) {

这是我添加异步的地方,如前所述。

client.connect(async function(err) {

您会注意到我也让您的路线使用异步,因为您之前会遇到问题。请注意原始代码中的两行:

  _prepareDetails(activityId,Id).then(xx => console.log(xx));
response.send('xx');

您的响应将在您进行数据库调用之前发送,因为您没有将 response.send 包装在 .then 中。您可以将 response.send 移至 .then 中,但如果您要使用 async/await,我会一直使用它。所以你的新路线将如下所示:

app.post('/getDetails', async (request,response)=>{

var Id = request.body.Id;
var activityId = request.body.activityId;
let xx = await _prepareDetails(activityId,Id);
response.send('xx');
})

关于javascript - wait 仅在异步函数中有效 - nodejs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55816290/

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