res.format谈判代表与快递路由器获得发布

时间:2016-05-31 12:47:52

标签: javascript express passport.js

看到express content negotiator,我想根据内容标题来处理响应。

例如,这是我的.get()

authRoute.route('/login')
.get(function(req, res) {
  res.format({
    'text/html': function() {
      res.render('login', {
        user: req.user,
        error: req.flash('error'),
        loginMessage: req.flash('loginMessage'),
        active: 'login'
      });
    },
    'application/json': function() {
      res.json({
        message: 'This is login page'
      })
    }
  })
})

我想要做的就是,如果请求标头是标准文本/ html,它应该显示html页面和json响应,如果请求是application / json。

问题是,它没有正确拦截标题。虽然我提出请求(通过邮差),将标题设置为application/json,但它仍会显示res.format({..})

中的第一个条件

以上总是显示text/plain,而不是匹配正确的条件。

对我做错的任何帮助?

authRoute.route('/login')

....

.post(passport.authenticate('local-signup', {
  successRedirect: '/profile', // redirect to the secure profile section
  failureRedirect: '/register', // redirect back to the signup page if there is an error
  failureFlash: true // allow flash messages
}))

2 个答案:

答案 0 :(得分:2)

我的猜测是你可能在请求中使用了错误的标题(也许是Content-Type?)。您需要使用Accept标头。另外,您的文字说json/application;那当然应该是application/json

我不使用Postman,但是使用cURL它可以正常工作:

$ curl -H'Accept:application/json' http://localhost:3000

答案 1 :(得分:0)

使用req.headers

的示例演示
var express = require('express');
var app = express();

app.get('/', function (req, res) {
    var contentType = req.headers['content-type'];
    if(contentType === 'application/json') {
        return res.json({
            message: 'This is login page'
        });
    }
    res.render('login', { // if not explicitly set, return default render
        user: req.user,
        error: req.flash('error'),
        loginMessage: req.flash('loginMessage'),
        active: 'login'
    });
});

app.listen(3001, function () {
    console.log('open localhost:3001');
});

卷曲测试

curl localhost:3001 -H "content-type: application/json"