Javascript Mongoose Express.js从多个查询中获取结果
我试图使用异步方法从mongodb上的一系列查询中获得结果,但不幸的是,我生成的对象在异步函数范围之外没有定义Javascript Mongoose Express.js从多个查询中获取结果,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我试图使用异步方法从mongodb上的一系列查询中获得结果,但不幸的是,我生成的对象在异步函数范围之外没有定义 let dataObject = { prop1: 1, prop2: 2 .... }; let result = {}; _.each(dataObject, async function (val, key) { let query = [
let dataObject = {
prop1: 1,
prop2: 2
....
};
let result = {};
_.each(dataObject, async function (val, key) {
let query = [
{
$match: {
x:1
....
}
}
];
let = MyModel.aggregate(query);
let data = await q.exec();
if (data.length > 0) {
result[key] = data[0].myProp;
console.log(result); // I can see result here
}
});
console.log('====>>', result); // Here the result is undefined
我缺少什么?对于这个问题,您可以创建一个promise函数,例如
getData
,dataObject作为输入参数,函数返回结果如下:
let async = require('async');
let q = require('q');
const getData = async (dataObject)=>{
let defer =q.defer();
let result = []
input = Object.keys(dataObject)
async.eachSeries(input , async(key)=>{
try {
let query = [
{
$match: {
x:1
....
}
}
];
let data = await MyModel.aggregate(query).lean();
if (data.length > 0) {
result[key] = data[0].myProp;
console.log(result);
}
} catch (error) {
console.log(error)
}
},()=>{
console.log("finish process")
defer.resolve(result)// return final data
})
return defer.promise
}
const mainFunctio = async()=>{
dataObject
console.log(start)
result = await getData(dataObject)
console.log(result)
}
在main函数中调用此函数(getData
),如下所示:
let async = require('async');
let q = require('q');
const getData = async (dataObject)=>{
let defer =q.defer();
let result = []
input = Object.keys(dataObject)
async.eachSeries(input , async(key)=>{
try {
let query = [
{
$match: {
x:1
....
}
}
];
let data = await MyModel.aggregate(query).lean();
if (data.length > 0) {
result[key] = data[0].myProp;
console.log(result);
}
} catch (error) {
console.log(error)
}
},()=>{
console.log("finish process")
defer.resolve(result)// return final data
})
return defer.promise
}
const mainFunctio = async()=>{
dataObject
console.log(start)
result = await getData(dataObject)
console.log(result)
}
作为一个参考,我张贴了一个解决方案,我发现,看起来非常简单。 我尝试使用一个简单的for循环,并删除了exec()(正如Mohammad所建议的那样),而不是使用u2;.each运算符,结果正如预期的那样:
let dataObject = {
prop1: 1,
prop2: 2
....
};
let result = {};
let allKeys = Object.keys(dataObject)
for (key of allKeys) { {
let query = [
{
$match: {
x:1
....
}
}
];
let data = MyModel.aggregate(query);
if (data.length > 0) {
result[key] = data[0].myProp;
}
});
console.log('====>>', result); // works fine!
我已经检查了多次代码:/maybe是因为async/await作用域?我尝试了您的解决方案,但使用此方法我得到了属性的值(例如,在prop1中,我在属性名称上得到了1),我需要两个键值来创建最终的对象。谢谢。我已经更新了我的答案,检查它,输入=对象。键(数据对象)我已经相应地更新了代码,但是结果对象仍然没有定义。我还尝试在循环中手动填充属性,结果总是在开始时定义的空数组。我很困惑。。。ThanksI编辑了我的答案,运行它,并向我显示输出结果。我也尝试过:结果:{}输出:[]完成谢谢