Подтвердить что ты не робот

В express.js, любой способ захватить запрос как json, так и html в одной функции?

Кто-нибудь знает способ в 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
});

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

4b9b3361

Ответ 1

Маршрут - это простая строка, которая скомпилирована в 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

Ответ 2

Я верю 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();
});

Ответ 3

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

Я просто убеждаюсь, что все запросы 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 });
}