gpt4 book ai didi

node.js - Node Js Async Await 给出第一个响应 Empty

转载 作者:搜寻专家 更新时间:2023-11-01 00:35:14 26 4
gpt4 key购买 nike

我是 Node js 中异步/等待编码的新手。我正在尝试从 mongodb 获取数据,然后将结果填充到一个对象中。但是当我退出服务器并重新打开它然后点击 Node js 中的 API 时,我在这里遇到了一个奇怪的问题,第一个响应总是空的。我在第一次尝试后一点击 API 就开始收到响应,下面是我的代码

let resu={};

router.get('/getTarrifDetails',async (req,res,next) => {
await Tarrif.find().distinct('tarrif_type',(err,docs) => {
docs.forEach(async (ele) => {
let count= User.countDocuments({tarrif_type:ele});
result.push(ele);
result[ele] = await count;
result.push(count);
});
});

getAll(res);
});

async function getAll(res) {
if(await resu.length!=0) {
res.send(resu);
}
}

最佳答案

您的代码有误。

1) 不建议将上下文变量 resu 存储在请求范围之外。

2) result.pushresult 变量在哪里?再次超出范围?

3) resu.length ?它不是一个数组,它是一个对象,所以你不会得到 false0 结果。

4) find().distinct('tarrif_type', (err,docs) => ... mongoose 支持 promises,那么为什么要将它与回调一起使用?

5) await resu.length ?这不是一个 promise ,它只是一个对象,长度是属性,你不能从非 promise 属性中请求 await

6) getAll 如果 resu.length 真的会有 0 怎么办?它会回应什么? - 因此请求将挂起,因此您必须做出任何响应以正常关闭请求期间创建的连接。


所以整体修复应该有效:

router.get('/getTarrifDetails', async (req, res) => {
try {
const tarrifTypes = await Tarrif.find().distinct('tarrif_type');

const tarrifCounters = {};
let total = 0;
for(const tarrifType of tarrifTypes) {
const count = await User.count({tarrif_type: tarrifType});
tarrifCounters[tarrifType] = count;
total+= count;
}

res.status(200).send({
tarrifTypes,
tarrifCounters,
total
});
} catch(error) {
res.status(500).send(error.message);
}
});

或使用并行性:

const getTarrifUsersCounters = async (tarrifTypes) => {
// initial result
const result = {
tarrifTypes,
tarrifCounters: {},
total: 0
};

// if no tarriffTypes passed return result
if (!(Array.isArray(tarrifTypes) && tarrifTypes.length > 0)) {
return result;
}

// generating array of promises from tarrifTypes
const callStack = [];
for(const tarrifType of tarrifTypes) {
callStack.push(
new Promise(async resolve => {
const count = await User.count({tarrif_type: tarrifType});
resolve({tarrifType, count});
});
);
}

// calling promises array in parallel
if (callStack.length) {
(await Promise.all(callStack))
.forEach(
({tarrifType, count}) => {
result.tarrifCounters[tarrifType] = count;
result.total += count;
});
}

return result;
};

router.get('/getTarrifDetails', async (req, res) => {
try {
const tarrifTypes = await Tarrif.find().distinct('tarrif_type');
const result = await getTarrifUsersCounters(tarrifTypes);
res.status(200).send(result);
}
catch(error) {
res.status(500).send(error.message);
}
});

关于node.js - Node Js Async Await 给出第一个响应 Empty,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54253668/

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