javascript - NodeJS 异步数据库获取服务器卡住

标签 javascript node.js express asynchronous

我有一个在 NodeJS(express + mongoose + jade)上运行的应用程序。 我有一个后路由/search(所有路由都在一个单独的模块中),它应该处理从mongo数据库获取数据并将其插入到jade模板中(在本例中只是打印控制台):

router.post('/search', function (req,res) {

    var componentsArray = null;

    function getArray(){
        console.log('Initializing...');
        componentsArray = dataExchanger.search(req.body.select, req.body.selectType, req.body.searchField);
    }
    getArray(function () {
        console.log('Documents returned.');
        console.log('Printing array...');
        console.log('Array: ' + componentsArray);
        console.log('Array type: ' + typeof (componentsArray));
        console.log('Rendering page...');
        res.render('search_results');
    });
});

在不同模块中实现的搜索和获取功能dataExchanger:

exports.search = function(select, type, data) {
    console.log('Fetching documents...');
    componentsModel.find({name: data}, function (err, docs) {
        if(!err) {
            console.log('Returning documents...');
            return docs;
        } else {
            console.log('Can\'t return documents!');
            throw err;
        }
    });

};

问题是,当我使用getArray()的回调函数时,服务器在返回文档时卡住并停止响应。 我做错了什么?

最佳答案

尝试使用异步/等待

router.post('/search', async (req,res) => {
  let componentsArray;

  try {
     componentsArray = await dataExchanger.search(req.body.select, req.body.selectType, req.body.searchField);
  } catch(e){
    //If error in request and no data.
    console.error('Error', e.message);
    return res.render('error_message');
  }

  console.log('Documents returned.');
  console.log('Printing array...');
  console.log('Array: ' + componentsArray);
  console.log('Array type: ' + typeof (componentsArray));
  console.log('Rendering page...');

  res.render('search_results');

});

这是您的数据交换器

exports.search = function(select, type, data) {
   console.log('Fetching documents...');

   return new Promise((resolve, reject) => {
     componentsModel.find({name: data}, function (err, docs) {
       if(err) return reject(err);
       resolve(docs);
      });
   })
};

进一步阅读:promises , async/await

关于javascript - NodeJS 异步数据库获取服务器卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50838457/

相关文章:

javascript - 使用自己的 Web 服务 api 上传文件

node.js - Nodejitsu 应用程序在启动后立即停止

Java/jetty/野蝇 : Gracefully Handle Aborted Client Connections

javascript - 使用 Kineticjs 单击时将图像旋转到一定 Angular

node.js - 对公共(public)类使用共享 Node 模块

javascript - Jest 报告测试通过,即使 expect 断言失败

javascript - 传递嵌套文档查询字段

node.js - Chai 没有到达 .end()

javascript - node.js:从其他文件访问导出的函数

javascript - 如何以字符串形式返回 promise 的结果?