Я пытаюсь сделать запрос 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.info(err);
} else {
console.info(newjob);
}
});
});
});
Job.find({"location": { $regex: location, $options: 'i'}, "description": { $regex: description, $options: 'i'} }, function(err, jobs){
if (err){
console.info(err);
} else {
res.render("jobs", {jobs:jobs});
}
});





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