NodeJS Async База данных извлекает зависание сервера - PullRequest
0 голосов
/ 13 июня 2018

У меня есть приложение, работающее на NodeJS (экспресс + мангуст + джейд).У меня есть пост-маршрут / search (все маршруты находятся в отдельном модуле), который должен обрабатывать выборку данных из базы данных mongo и вставлять ее в шаблон Jade (в данном случае просто печатать консоль th):

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 () , сервер просто зависает в момент возврата документов и перестает отвечать.Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Попробуйте использовать 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');

});

А вот ваш dataExchanger

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

Дополнительная информация: обещаний , async / await

0 голосов
/ 13 июня 2018
    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');
        });
    });

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

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