В 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
});
Могу ли я использовать параметр?
Ответы
Ответ 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 });
}