2015-03-25 2 views
0

Я использовал экспресс-генератор для создания базовой структуры экспресс-приложения.Экспресс-роутер. Не работает

У меня есть это в маршрутах/my.js:

router.use('/update', function(req, res, next) { 
    req.headers['content-type'] = 'application/json'; 
    console.log('router use invoked'); 
    next(); 
}); 

router.get('/update', function(req, res, next) { 
    console.log('=== GET /my/update', req.body); 
}); 

router.post('/update', function(req, res, next) { 
    console.log('=== POST /my/update', req.body); 
}); 

И в app.js я добавил:

var my = require('./routes/my'); 

app.use('/', routes); 
app.use('/users', users); 
app.use('/my', my); 

Это работает отлично для ГЭТ, а маршрутизатор среднего изделия на самом деле work (console.log вызывается), но заголовки не устанавливаются в app/json (поскольку сообщение журнала в сообщении выводит тело на пустое место).

я могу решить эту проблему путем добавления этого перед любой другой средней посудой

app.use('/my/update', function(req, res, next) { 
    req.headers['content-type'] = 'application/json'; 
    next() 
}); 

И это работает. Я попытался переместить линию app.use('my', my); перед любым другим промежуточным продуктом, но он полностью прекратил работу.

Что я могу сделать для того, чтобы отдавать приоритет моему router.use?

ответ

0

Вы добавляете заголовок к объекту request, а не к ответу. Также предпочтительный способ сделать это ниже.

router.use('/update', function(req, res, next) { 
    res.header('content-type', 'application/json'); 
    console.log('router use invoked'); 
    next(); 
}); 
+0

Я знаю, что настраиваю заголовок запроса, и это то, что я хочу. Я хочу установить тип контента по умолчанию для запроса. –

+0

Вы не можете установить заголовок запроса, только получите. Если вы хотите установить заголовок, вы должны сделать это в объекте ответа. Запрос поступает, ответ отправляется. –

+0

Afaik Я могу, средние товары вызывают до получения данных запроса. И, как я уже сказал, он работал с app.use, а не с маршрутизатором.использовать. –

0

Экспресс JS - это все о работе со средними изделиями.

Согласно официальной документации here, Middleware является функция доступа к объекту запроса (REQ), объект ответа (Рез), а следующий промежуточного слоя в линии в цикле запрос-ответ на экспресс приложение, обычно обозначаемое переменной с именем next.

Middleware может:

  • Выполнение кода
  • Вносить изменения в запрос и ответ объекты
  • Конец цикла запрос-ответ
  • вызова следующего промежуточного слоя в стеке

Я хотел бы указать несколько вещей о вашем my.js маршрутизатора, если вы не хотите, чтобы отправить любой ответ обратно, то это должно быть что-то вроде:

router.get('/update', function(req, res, next) { 
    res.end(); 
}); 

router.post('/update', function(req, res, next) { 
    res.end(); 
}); 

Вы должны закончить ваш запрос, ответ цикл, иначе он будет повис. Практически вы хотели бы отправить некоторые данные (предпочтительно данные JSON) обратно клиенту, чтобы вы могли использовать res.json() или res.send(). Вам не нужно устанавливать заголовки приложений/json, если вы используете res.json().

+0

Это не имеет ничего общего с моей проблемой. У меня уже есть res.end(), он был удален для простоты. Опять же, моя проблема заключается в заказе среднего уровня –

+0

Короче, если вы хотите отправить JSON, вам не нужны никакие заголовки, просто используйте res.json(), он отлично работает. – NarendraSoni

+0

Я не хочу отправлять JSON, я хочу получить JSON ...... –

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