Запрос 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 });
}
});
}
Но я бы посоветовал вам использовать обещания вместо обратного вызова, это сделает ваш код более читабельным.
попробуйте что-то вроде этого: и, пожалуйста, уточните в своей библиотеке, что вы используете, если поддержка обещает
(скорее всего, так и есть!)
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
});
}
Пожалуйста, подумайте, насколько читабельнее второй пример,Вы можете прочитать больше об обещаниях где угодно.Я бы предложил начать здесь
Веселитесь :)