我正在尝试发出API请求,将一些值保存到数据库中,然后使用存储在数据库中的结果呈现ejs文件。问题是请求花费的时间太长。因此,当我渲染页面时,我的数据库仍然没有任何内容。我怎样才能解决这个问题?我应该添加延迟或其他内容吗?我正在使用NodeJs请求模块
request(url, function(error, response, body){
if(!error&&response.statusCode==200){
var parsedData = JSON.parse(body);
}
parsedData.forEach(function(element){
Job.create({
//here I will save data to my DB
}, function(err, newjob){
if(err){
console.log(err);
} else {
console.log(newjob);
}
});
});
});
Job.find({"location": { $regex: location, $options: 'i'}, "description": { $regex: description, $options: 'i'} }, function(err, jobs){
if(err){
console.log(err);
} else {
res.render("jobs", {jobs:jobs});
}
});
答案 0 :(得分:0)
API请求可能需要一些时间, 但是您不等待插入完成。
您可以执行以下操作,而无需额外的程序包:
request(url, function (error, response, body) {
if (!error && response.statusCode == 200) {
var parsedData = JSON.parse(body);
}
let cb_counter = 0;
parsedData.forEach(function (element) {
Job.create({
//here I will save data to my DB
}, function (err, newjob) {
if (err) {
console.log(err);
} else {
// another job inserted into db
cb_counter++;
// if we files done:
if (cb_counter == parsedData.length){
// now are are ready to find and render jobs
// make sure res.render is in the scope , or pass it
// to the function
findJobs(res);
}
}
});
});
});
function findJobs(res){
Job.find({ "location": { $regex: location, $options: 'i' }, "description": { $regex: description, $options: 'i' } }, function (err, jobs) {
if (err) {
console.log(err);
} else {
res.render("jobs", { jobs: jobs });
}
});
}
但是我建议您使用Promise而不是回调, 它将使您的代码更具可读性。
尝试类似这样的方法: 如果支持的话,请向您的图书馆确认是否使用了
(很可能是这样!)
request(url, function (error, response, body) {
if (!error && response.statusCode == 200) {
var parsedData = JSON.parse(body);
}
let promises = [];
parsedData.forEach(function (element) {
promises.push(Job.create({
//your data to db
}))
});
Promise
.all(promises)
.then(() => findJobs(res))
.catch(err => {
// handle error
})
});
function findJobs(){
Job.find({
"location": { $regex: location, $options: 'i' },
"description": { $regex: description, $options: 'i' }
}).then(jobs => {
// usualy you should validate that jobs is not an empty array
res.render("jobs", { jobs });
}).catch(err => {
// hadle error finding data
});
}
请考虑第二个示例的可读性。 您可以在任何地方阅读有关诺言的更多信息。 我建议开始here
玩得开心:)