node.js - 在 Express.js 中,我们如何让 res.send 等待从数据库中获取数据
问题描述
res.send()
在从方法中从数据库(Mongodb)中获取数据之前,该方法返回(空)
Skills.find({ skillbranch: branches[i]._id }, function (err, skills) {
我们如何在返回之前添加等待或异步?
我正在学习 node/express 并且无法在他们使用async
, await
, Promise
.
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 调用上创建一个承诺。完成后,只需将其转换为数组,将其推送到您的分支技能,并使用您的新更新版本解决承诺。然后使用新的更新版本发送数据,而不是您一直在使用的全局 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));
});
推荐阅读
- c# - animator.SetTrigger 不触发动画
- microsoft-graph-api - 是否有 API 可用于从 MS Graph Bookings API 检索 Microsoft Bookings 中预订的可用时间段?
- python - Why won't my QFileDialog load its directory or apply filters?
- amazon-web-services - Unknown key Message when using Aws Cloudfront Signed URL With Java
- dart - Dart: A RESTful service responds with correct data, but no object is being added to a List
- command - Exit Python Discord Bot script to command line
- django - 如何将 css 类应用于 Django 中的 TimeDurationWidget
- vaadin - Vaadin 设计器没有生成正确的文件
- php - 当我检索特定数据时,find() 方法和 first() 方法之间哪个最好
- machine-learning - 在协同过滤的梯度下降中,x 和 theta 是否同时更新?