Вам нужно либо передать обратный вызов для агрегирования, либо использовать .exec()
, когда вы закончите, чтобы получить от него обещание. В mongoose есть много вещей, которые могут быть .then (), даже если они не являются реальными обещаниями, и Aggregate является одним из них. Однако если вы агрегируете (...). Exec (), вы всегда получаете реальное обещание.
Поскольку мы говорим здесь о экспрессе, это промежуточное ПО. Просто прикрепите свои вещи к req
и двигайтесь вперед.
async function myMiddleware(req, res, next) {
const { demo_id } = req.params;
req.results = await FlexPotenzial.aggregate([
{
$addFields: {
subID: {
"$eq": [{"$trunc": {"$divide": ["$_id", 1000000]}},+demo_id]
}
}
},
{
"$match": { subID : true }
}
]).exec();
next();
}
// All routes matching this will use the middleware
app.use('/aggregate-me/:demo_id*', myMiddleware);
// And then we can access req.results anywhere further down the stream....
app.get('/aggregate-me/:demo_id/something', doSomething);
app.get('/aggregate-me/:demo_id/somethingElse', doSomethingElse);
Вы также можете использовать промежуточное ПО для одиночных маршрутов
app.get('/something-entirely-different/:demo_id', myMiddleware, (req,res)=>{
res.json(results);
});
Или даже:
app.get('/abc', [tonsof, middleware, inAnArray], endpoint);
Правило состоит в том, чтобы продолжать использовать next()
для продолжения цепочки промежуточного программного обеспечения и что-то вроде res.end
для ее завершения.