API请求时间过长

时间:2018-12-01 12:18:02

标签: node.js api node-modules

我正在尝试发出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 :(得分: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

玩得开心:)