2014-07-27 3 views
7

Я использую узел с выражением 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 обратного вызова передается. Так что здесь происходит? Как это работает за кулисами? И как я могу поставить там асинхронный код?

+0

Не могли бы вы быть более ясными, какой асинхронный код вы хотите ввести в маршрут, и как это связано с обратным вызовом 'next', который имеет все маршруты. – adeneo

+1

Когда вы 'res.render()' что-то, вам не нужно вызывать 'next()' (даже если он передан так, что вы * могли бы *, если хотите), потому что это ** конец цепочки **. – Bergi

+0

Экспресс как-то должен знать, когда мой обратный вызов завершается, чтобы закрыть сокет и удалить данные, связанные с этим запросом. Правильно ли я понимаю, что если я назову 'res.render', он будет считать, что нет запланированных асинхронных задач, и ему не нужно ждать, пока' next' будет вызван? –

ответ

5

Экспресс будет ждать, пока вы не позвоните res.render, чтобы закрыть розетку. Это означает, что вы можете передать res.render в обратный вызов, который занимает X секунд для выполнения, и все будет работать.

next позволяет перейти к следующему маршруту, который отображает вашу ценность, вы можете найти очень хорошее объяснение здесь: What is the parameter "next" used for in Express?

Но под то, что вы спрашиваете здесь. Момент render() вызывается на объекте res, тогда данные будут отправлены и сокет будет закрыт.

Смежные вопросы