2015-07-09 4 views
0

Для каждого запроса, который происходит, я хотел бы проверить, установлен ли параметр в строке запроса. Если нет, приложение должно отправить определенное сообщение; в противном случае, маршрут по мере необходимости.ExpressJS - Отправить ответ от промежуточного программного обеспечения

app.js В:

app.use(function(req,res,next){ 
    if(req.query.key === undefined) { 
     res.send("Sorry!"); 
    } 
    req.db = db; 
    next(); 
}); 

app.use('/', routes); 

Когда '/' запрашиваются без Пар, отображаются Sorry!. Тем не менее, мое ExpressJS приложение вылетает с этой ошибкой:

Error: Can't set headers after they are sent.

Я не совсем уверен, почему это происходит. Я попытался переместить чек на сам маршрут в index.js, но я все равно получаю ту же ошибку.

ответ

3

Это потому, что вы продолжаете выполнение и вызываете next(), который переходит на следующее промежуточное программное обеспечение или маршрут в стеке.

Возвращение рано, чтобы оно не переходило на следующее промежуточное ПО.

app.use(function(req,res,next){ 
    if(req.query.key === undefined) { 
     //return out of the function here 
     return res.send("Sorry!"); 
    } 
    req.db = db; 
    next(); 
}); 

app.use('/', routes); 
+0

Спасибо, это сработало. По какой-то причине я предположил, что 'res.send()' по существу эквивалентен оператору return. – tverghis

+1

@cmlndz В этом случае 'if (req.query.key)' отлично, нет необходимости в строгой проверке типов. Плюс вышеупомянутый метод действителен, см. Http://stackoverflow.com/questions/4725603/variable-undefined-vs-typeof-variable-undefined. Даже если нет параметра запроса, всегда определяется 'req.query'. –

+0

@BenFortune вы правы в req.query (возможно, я перетащил эту и из старой версии Express). Thnx – cmlndz

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