Запрос API занимает слишком много времени - PullRequest
0 голосов
/ 01 декабря 2018

Я пытаюсь сделать запрос 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});
        }
    });

1 Ответ

0 голосов
/ 02 декабря 2018

Запрос 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
    });
}

Пожалуйста, подумайте, насколько читабельнее второй пример,Вы можете прочитать больше об обещаниях где угодно.Я бы предложил начать здесь

Веселитесь :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...