![](/img/trans.png)
[英]Express.js - How to send alert from Express to Client using res.render? Not res.send
[英]In Express.js how can we make res.send to wait for data to be fetched from database
方法res.send()
在從方法從數據庫(Mongodb)獲取數據之前返回(空)
Skills.find({ skillbranch: branches[i]._id }, function (err, skills) {
如何在返回之前添加await或async?
我正在學習node / express,並且無法在stackoverflow上的其他帖子中使用async
, await
, Promise
來async
語法來使用一些答案/示例。
const Skills = require('../models/skills.model.js');
const SkillBranch = require('../models/skillbranch.model.js');
exports.getSkills = function (req, res) {
let branchSkills = [];
SkillBranch.find(function (err, branches) {
if (branches) {
var obj = {
"status": "200",
"message": "skills",
"data": branches
}
for (var i = 0; i < branches.length; i++) {
Skills.find({ skillbranch: branches[i]._id }, function (err, skills) {
console.log(JSON.stringify(skills)); //this is returning after res.send()
branchSkills.push(skills);
})
if (i == branches.length - 1) {
var obj = {
"status": "200",
"message": "skills",
"data": branchSkills
}
//this is returning before Skills.find() is complete
res.send(JSON.stringify(obj));
}
}
} else {
var obj = {
"status": "500",
"message": "Getting skills ",
"data": []
}
res.send(JSON.stringify(obj));
}
})
};
這樣的事情應該有效。
在mongo調用上創建一個promise。 完成后,只需將其轉換為數組,將其推送到您的分支技能,並使用新的更新版本解決承諾。 然后使用新的更新版本而不是您一直使用的全局branchSkills對象發送數據。
應該注意我不確定你使用的分支技能是什么,但你可能只是能夠解決skills
而不推動全局陣列? 這應該可以解決你的時間問題。
new Promise((resolve, reject) => {
Skills.find({ skillbranch: branches[i]._id }).toArray((err, skills) => {
if (err) {
reject(err);
} else {
branchSkills.push(skills);
resolve(branchSkills);
}
});
});
}).then(updatedBranchSkills => {
if (i == branches.length - 1) {
var obj = {
"status": "200",
"message": "skills",
"data": updatedBranchSkills
}
res.send(JSON.stringify(obj));
});
你必須在Skills.find()
回調中調用res.send()
,而不是在它之外。 但是,由於您正在調用多個Skills.find()
您需要跟蹤已返回的回調數。 為此,您可以使用變量:
// Keep track of completed find():
var completed = 0;
for (var i = 0; i < branches.length; i++) {
Skills.find({ skillbranch: branches[i]._id }, function (err, skills) {
console.log(JSON.stringify(skills));
completed++;
branchSkills.push(skills);
if (completed == branches.length) {
var obj = {
"status": "200",
"message": "skills",
"data": branchSkills
}
res.send(JSON.stringify(obj)); // INSIDE callback
}
}) // <--- note that callback ends here!
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.