в express.js, любой способ захватить запрос к json и html в одной функции? - PullRequest
24 голосов
/ 19 января 2012

Кто-нибудь знает способ в express.js для захвата запросов в одной функции для html и json?

По сути, я хочу один маршрут для /users и /users.json - как это делает рельсы со своими маршрутами -> контроллером.

Таким образом, я могу инкапсулировать логику в одну функцию и принять решение о рендеринге html или json.

Что-то вроде:

app.get('/users[.json]', function(req, res, next, json){
  if (json)
    res.send(JSON.stringfy(...));
  else
    res.render(...); //jade template
});

Могу ли я использовать параметр, возможно?

Ответы [ 3 ]

53 голосов
/ 20 октября 2012

Я думаю, res.format () - это способ сделать это в Express 3.x и 4.x:

res.format({
  text: function(){
    res.send('hey');
  },

  html: function(){
    res.send('<strong>hey</strong>');
  },

  json: function(){
    res.send({ message: 'hey' });
  }
});

Это зависит от заголовка Accept, однако вы можете изменить его самостоятельно, используя пользовательское промежуточное ПО или что-то вроде connect-acceptoverride .

Одним из примеров пользовательского промежуточного программного обеспечения может быть:

app.use(function (req, res, next) {
  var format = req.param('format');

  if (format) {
    req.headers.accept = 'application/' + format;
  }

  next();
});
20 голосов
/ 19 января 2012

Маршрут - это простая строка, которая внутренне компилируется в RegExp, как сказано в руководстве, так что вы можете сделать что-то вроде этого:

app.get("/users/:format?", function(req, res, next){
  if (req.params.format) { res.json(...); }
  else {
    res.render(...); //jade template
  }
});

Проверьте больше здесь: http://expressjs.com/guide.html#routing

1 голос
/ 10 марта 2017

Я не был доволен вышеуказанными ответами. Вот что я сделал вместо этого. Пожалуйста, проголосуйте, если вам это поможет.

Я просто проверяю, что все запросы json имеют заголовок Content-Type, установленный на 'application / json'.

if (req.header('Content-Type') == 'application/json') {
  return res.json({ users: users });
} else {
  return res.render('users-index', { users: users });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...