节点 js Array.push() 无法使用猫鼬
Posted
技术标签:
【中文标题】节点 js Array.push() 无法使用猫鼬【英文标题】:node js Array.push() not working using mongoose 【发布时间】:2017-12-11 19:44:00 【问题描述】:我是 meanstack 开发的初学者。我正在尝试在 foreach 循环中将值推送到数组中,但最后我得到的是空数组。
我的代码:
router.get("/", function(req, res)
ourpackage.find().sort(_id:1).exec(function(err,resdoc)
var rest = [];
resdoc.forEach(function(doc)
masterRoomimage.find(ourpackageId:doc._id,function(err,ourpackageimagevalue)
if(err) res.send(err);
var ourpackagedetail = JSON.parse(JSON.stringify(doc));
var stringifyimages = JSON.parse(JSON.stringify(ourpackageimagevalue));
var ourpackage = _.merge(,ourpackagedetail,masterRoomimages:stringifyimages);
rest.push(ourpackageimagevalue);
//print all rest array value
console.log(rest);
);
);
//print empty rest array value
console.log(rest);
res.send(rest);
);
);
我们的包架构
"_id": "58e396d4215bc61338d2c06e",
"first_title": "test 1",
"berief_text": "<p>testing </p>",
ourpackagesimages 架构
[
"_id": "59424d49fcc8100050916bf4",
"imageLocation": "first.jpg",
"ourpackageId": "58e396d4215bc61338d2c06e",
"__v": 0
,
"_id": "59424d49fcc8100050916bf5",
"imageLocation": "third.jpg",
"ourpackageId": "58e396d4215bc61338d2c077",
"__v": 0
,
"_id": "59490ad44e26c13324906433",
"imageLocation": "second.jpg",
"ourpackageId": "58e396d4215bc61338d2c06e",
"__v": 0
]
预期输出
[
"_id": "58e396d4215bc61338d2c06e",
"first_title": "test 1",
"berief_text": "<p>testing </p>",
"ourpackagesimages": [
"_id": "59424d49fcc8100050916bf4",
"imageLocation": "first.jpg",
"ourpackageId": "58e396d4215bc61338d2c06e",
"__v": 0
,
"_id": "59490ad44e26c13324906433",
"imageLocation": "second.jpg",
"ourpackageId": "58e396d4215bc61338d2c06e",
"__v": 0
]
]
得到输出为空
[]
【问题讨论】:
小心:forEach
是同步的,而find
是异步的。我认为使用aggregate
如answer 所示可能对您有用。
【参考方案1】:
您不能在同步函数中调用异步函数(在这种情况下为forEach
)。结果在收集之前被访问,这就是空数组输出的原因。
一个非常方便且易于使用的库是async。对于您的特定用例,map 或 mapLimit 函数可以。
var async = require('async');
router.get("/", function(req, res)
ourpackage.find().sort(
_id: 1
).exec(function(err, resdoc)
async.mapLimit(resdoc, 5, function(doc, callback)
masterRoomimage.find(
ourpackageId: doc._id
, function(err, ourpackageimagevalue)
if (err) return callback(err);
var ourpackagedetail = JSON.parse(JSON.stringify(doc));
var stringifyimages = JSON.parse(JSON.stringify(ourpackageimagevalue));
var ourpackage = _.merge(, ourpackagedetail,
masterRoomimages: stringifyimages
);
return callback(null, ourpackageimagevalue);
);
, function(err, rest)
if(err)
res.send(err);
else
res.send(rest);
);
);
);
【讨论】:
嗨用户名:@TalhaAwan 我理解异步和同步函数上面提到的用于合并两个集合(我们的包集合和我们的包图像集合)的输出的任何其他解决方案 @Senthil,你在问另一个问题吗?对不起,我没有得到它。能否请您详细说明。 感谢您的快速回复。上面我提到了1.ourpackages schema,2.ourpackageimages schema,最后我想要预期的输出。【参考方案2】:简单地说, 声明一个数组 休息 = [];
rest[] = ourpackageimagevalue;
希望对你有帮助
【讨论】:
我收到错误 SyntaxError:Unexpected token ]以上是关于节点 js Array.push() 无法使用猫鼬的主要内容,如果未能解决你的问题,请参考以下文章