Я использую узел с выражением 4.0. Я не могу найти что-либо в Интернете (включая документы) о встраивании асинхронного кода в маршрут.Узел асинхронный код маршрута
С промежуточного слоя это довольно просто:
app.use('/something', function (req, res, next)
{
doSomethingAsync(function(err, probablySomethingElse)
{
// probably some error checking
next();
});
});
Проблема маршрутов в том, что нет next
обратного вызова, так как это выразить знать, когда, чтобы перейти к следующему заданию?
app.get('/something', function (req, res)
{
res.render('someTemplate');
// no next() here, but it still works
});
Если бы я должен был догадаться, я бы сказал, что экспресс переходит к следующей задаче сразу после выхода вышеуказанной функции. Но из любопытства я запустил следующий код ...
app.get('/something', function (req, res, next)
{
console.log(next);
});
... и есть на самом деле некоторые next
обратного вызова передается. Так что здесь происходит? Как это работает за кулисами? И как я могу поставить там асинхронный код?
Не могли бы вы быть более ясными, какой асинхронный код вы хотите ввести в маршрут, и как это связано с обратным вызовом 'next', который имеет все маршруты. – adeneo
Когда вы 'res.render()' что-то, вам не нужно вызывать 'next()' (даже если он передан так, что вы * могли бы *, если хотите), потому что это ** конец цепочки **. – Bergi
Экспресс как-то должен знать, когда мой обратный вызов завершается, чтобы закрыть сокет и удалить данные, связанные с этим запросом. Правильно ли я понимаю, что если я назову 'res.render', он будет считать, что нет запланированных асинхронных задач, и ему не нужно ждать, пока' next' будет вызван? –