Функция res.send () отправляет ошибку типа: обратный вызов не является функцией - хотя вся процедура выполняется правильно (async.waterfall) - PullRequest
0 голосов
/ 26 ноября 2018

Я пишу функцию для моего сервера Node.js (используя Express в качестве основы, MongoDB в качестве базы данных).Мне нужно вызвать два запроса mongoose:

(1) Найти данные, отфильтрованные по параметрам одной коллекции

(2) Агрегировать данные другой коллекции (необходимо получить результат из первого запроса, поскольку один атрибут получаетк этим результатам добавлено)

Теперь я использую async.waterfall функцию, которая позволяет гарантировать, что вторая операция запускается только после завершения первой.

Переменная resultResponse (в конце моего фрагмента кода) имеет правильное значение при запуске функции.

Проблема, с которой я сталкиваюсь:

Сервер выдает ошибку TypeError: обратный вызов не является функцией для первого обратного вызова.Этот тип ошибки также является ответом, который я получаю через почтальона, звонящего / getRoutes .Так что res.send () отправляет не переменную resultResponse назад (что правильно), но ошибку.

Кто-нибудь знает, как я могу решить эту проблему?Большое спасибо!

    let async = require('async');

    app.get('/getRoutes', function (req, res) {

    var param = req.query;
    let resultResponse;

    async.waterfall([

(1)

        function (param, callback) {
            let dataCallback;
            // first mongoose operation
            Route.find(param).lean().exec(function (err, data) {
                if (err)
                    throw err;
                dataCallback = data;
            }
                .then(callback(null, dataCallback)));
        }, 

TypeError: обратный вызов не является функцией

(2)

        function (aRoutes, callback) {
            let oRoutes = [];
            for (let i in aRoutes) {
            // second mongoose operation
                Rating.aggregate([{$match: {route: aRoutes[i]._id}}
                    , {
                        $group:
                            {_id: null, rating: {$avg: '$rating'}}
                    }
                ]).then(function (response) {
                    let oneRoute = aRoutes[i];
                    let avgRating = response[0].rating;
                    oneRoute.avg_rating = avgRating;

                    oRoutes.push(oneRoute);

                    if (i == (aRoutes.length - 1)) {
                        callback(null, oRoutes);
                    }
                });
            }
        }],
    function (err, result) {
        if (err) throw err;
        resultResponse = result; //console.log -> right result here
    });

res.send(resultResponse); });

1 Ответ

0 голосов
/ 26 ноября 2018

Ваша первая функция будет искать функцию callback в качестве первого параметра.Проверьте здесь для более подробной информации.param определяется глобально, поэтому вам не нужно передавать.

function (callback) {
  let dataCallback;
  // first mongoose operation
  Route.find(param).lean().exec(function (err, data) {
    if (err)
      throw err;
    dataCallback = data;
 }).then(function(){
   callback(null, dataCallback);
 });
}

ИЛИ

Просто верните data вместо создания undefined объекта.

function (callback) {
  // first mongoose operation
  Route.find(param).lean().exec(function (err, data) {
    if (err)
      throw err;
    return data;
 }).then(function(dataCallback){
   callback(null, dataCallback);
 });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...