Я пишу функцию для моего сервера 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); });