Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/446.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript NodeJS异步数据库获取服务器冻结_Javascript_Node.js_Express_Asynchronous - Fatal编程技术网

Javascript NodeJS异步数据库获取服务器冻结

Javascript NodeJS异步数据库获取服务器冻结,javascript,node.js,express,asynchronous,Javascript,Node.js,Express,Asynchronous,我有一个应用程序在NodeJS上运行(express+mongoose+jade)。 我有一个post路由/搜索(所有路由都在一个单独的模块中),它应该处理从mongo数据库获取数据并将其插入jade模板(在本例中,只需打印控制台): 在不同模块数据交换器中实现的搜索和获取功能: 问题是当我使用getArray()的回调函数时,服务器在返回文档时会冻结并停止响应。 我做错了什么 router.post('/search', function (req,res) { va

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

在不同模块数据交换器中实现的搜索和获取功能:

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

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

        var componentsArray = null;

        function getArray(cb){
            console.log('Initializing...');
            componentsArray = dataExchanger.search(req.body.select, req.body.selectType, req.body.searchField);
//Execute the callback    
cb();
        }
        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');
        });
    });
看起来您的搜索方法也是异步的,因此您需要将回调向下传递到该方法以获得所需的结果。

尝试使用async/await

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);
      });
   })
};

进一步阅读:,

您在哪里执行传递给getArray的回调?我正在传递匿名函数给它。抱歉,对于异步函数来说是新的。读了一些文章后仍然无法理解。您正在传递它,但没有执行它。执行应该是什么样子?像getArray(callback)和callback()?这样做。现在的问题是回调并不等待返回数组。所以现在在文档返回之前调用它。谢谢!就这样!我们将深入探讨。由于Express不处理承诺,因此最好使用try…catch…finally包装所有内容,否则可能会导致未处理的请求而没有错误(最好是未处理的承诺错误)。
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);
      });
   })
};