- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我是 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.push
? result
变量在哪里?再次超出范围?
3) resu.length
?它不是一个数组,它是一个对象,所以你不会得到 false
或 0
结果。
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/
所以我有这个表格..有 2 个字段。 “Youtube”和“link”我想做如果你已经填了YouTube,应该这样做: if(!empty($youtube)) { if ($pos === fal
我有一个要验证的输入: 这是 JS: jQuery("#input").live('change', function() { if("#input:not(
假设我在 someNode 中注册了一些带有 id 的小部件(比如 id1、id2)。现在,如果我这样做,domConstruct.empty(someNode),这将通过执行 someNode.in
我需要确定 IQueryable 方法是返回数据,还是像这样将其应用于 RadGrid 的数据源时返回“空”: RadGrid.DataSource = Method(x); if (
我有以下不能正常工作的 $_GET['category'] 也可以等于 0。 if ( empty( $_GET['category'] ) ){ // do something } else
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
这个问题在这里已经有了答案: In C#, should I use string.Empty or String.Empty or "" to intitialize a string? (31
使用下面的内容,我检查每个输入字段是否为空 if ( $("input:empty").length > 0 ) { $(":text[value=]").css('background'
这是有原因的吗?我问是因为如果您需要使用大量空字符,那么您会遇到与使用大量空字符串时相同的情况。 编辑:这种用法的原因是: myString.Replace ('c', '') 因此从 myStrin
我对 Apache POI 有一个大问题。 A B C D 1 text text text text 2
在阅读 MarkLogic 时 Query Performance and Tuning Guide ,我了解了 empty greatest 和 empty least 以及如何将其与 order
我正在使用.NET 3.5。我正在创建一个简单的类,并希望确保处理后的类不应该为 null 或者也不应该是新的.. 所以如果我们可以像这样测试它 Dim objClass as new Class()
我有这个 HTML 页面 foo pre:empty { display: none; } some text here in the pre element 而且我想知道为
我知道我能做到 unless [1].empty? 但是我想知道有没有办法呢? 最佳答案 以及 davidrac 提到的 #any?,以及 ActiveSupport有 #present?这更像是其他
在调试某些东西时,我看到了 STL vector::empty() 实现: bool empty() const {return (size() == 0); } 我相信,每当我们探测
我有一个 NavigationDrawer 来启动 fragment 。我有一个来自 TabPageIndicator 的包含 4 个选项卡的 fragment ,其中 fragment 包含 Lis
我正在使用 Jackson XML 2.8.9,不幸的是我找不到任何方法将空/空集合序列化为空节点。 负责序列化为 XML 的方法: protected byte[] toXml(final Coll
嗨,所有 SO 用户我对 null 和 Empty 的理解有点困惑。我知道 null 是特例,它不等于自身。我想知道如何确定它是空的,你告诉它是空的依据是什么,空也一样 它是基于内存分配还是什么? 如
这个问题在这里已经有了答案: What is the difference between String and string in C#? (66 个答案) 关闭 10 年前。 C# 中的 str
如果要创建一个空的T类型的IEnumerable,可以使用静态泛型方法创建 Enumerable.Empty() 参见 here了解更多信息。 为什么 Microsoft 选择此选项而不是对泛型类型使
我是一名优秀的程序员,十分优秀!