【发布时间】:2017-07-27 13:45:54
【问题描述】:
我是 Node.js 和 Mongoose 的初学者。我花了一整天的时间试图通过搜索 SO 来解决一个问题,但我就是找不到正确的解决方案。基本上,我使用从一个集合中检索到的值来查询另一个集合。为了做到这一点,我正在遍历先前检索到的结果的循环。
通过迭代,我能够填充我需要的结果。不幸的是,我遇到问题的领域是在数组中收集所需信息之前将响应发送回。我知道这可以通过回调/承诺来处理。我尝试了很多方法,但我的尝试并没有成功。我现在正在尝试使用Q library 来促进回调。我真的很感激一些见解。这是我目前卡住的部分的 sn-p:
var length = Object.keys(purchasesArray).length;
var jsonArray = [];
var getProductDetails = function () {
var deferred = Q.defer();
for (var i = 0; i < length; i++) {
var property = Object.keys(purchasesArray)[i];
if (purchasesArray.hasOwnProperty(property)) {
var productID = property;
var productQuery = Product.find({asin:
productQuery.exec(function (err, productList) {
jsonArray.push({"productName": productList[0].productName,
"quantity": purchasesArray[productID]});
});
}
}
return deferred.promise;
};
getProductDetails().then(function sendResponse() {
console.log(jsonArray);
response = {
"message": "The action was successful",
"products": jsonArray
};
res.send(response);
return;
}).fail(function (err) {
console.log(err);
})
});
当响应在第一个元素之后发送时,我特别能够发送 jsonArray 数组中的两个对象之一。
更新
感谢Roamer-1888的回答,我已经能够构造一个有效的JSON响应,而不必担心发送响应后设置标头的错误。
基本上,在getProductDetails() 函数中,我试图从Mongoose 查询中检索产品名称,同时映射purchasesArray 中每个项目的数量。从函数来看,最终我想形成以下响应:
response = {
"message": "The action was successful",
"products": jsonArray
};
其中,jsonArray 将采用来自getProductDetails 的以下形式:
jsonArray.push({
"productName": products[index].productName,
"quantity": purchasesArray[productID]
});
【问题讨论】:
-
您说“我正在使用从一个集合中检索到的值来查询另一个”,但代码仅包含数组
purchasesArray中的每个项目的一个查询。那么它是一个查询还是两个查询? -
或者,换一种说法,
purchasesArray是不是代码中没有显示的查询结果? -
@Roamer-18888,感谢您调查我的问题。你的猜测是对的。
purchasesArray确实是前面查询的结果。我删除了之前的查询以避免混淆。 -
所以,我的答案很接近。不要担心告诉它是否在数英里之外,我会删除它。
-
您的回答对我发送 JSON 响应有很大帮助。请查看我更新的帖子以了解我的一些最终查询。