表达单一路线,多种功能

时间:2015-06-01 07:31:11

标签: node.js express

是否可以针对单条路线提供多种功能。

app.get('/r1', function(req, res) {
  res.send('hello world 1');
});

app.get('/r1', function(req, res) {
  res.send('hello world 2');
});

原因:内容协商,https://en.wikipedia.org/wiki/Content_negotiation我根据不同作用域中的接受标头设置了不同的模块,因此我无法在路由器中从一个接触到另一个。

请告知。

1 个答案:

答案 0 :(得分:0)

虽然您最初描述的每条路线不能有多个功能,但您可以在路线内进行内容协商,

看看req.is(type) http://expressjs.com/api.html

的内容
app.get('/r1', function(req, res) {
  if(req.is('html')) {
    //do your html stuff
    return res.send('It was html')
  }

  if(req.is('json')) {
    //do your json stuff
    return res.send('It was json')
  }

    //wasn't html or json, so send a 406
    res.status(406);
    res.send('Content type not acceptable');
});

或者,有人做了一个方便的小npm包,完成上述操作: https://www.npmjs.com/package/express-negotiate

修改

根据评论,可以在Accept标头上使用res.format: 请参阅我之前的链接

app.get('/r1', function(req, res) {

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

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

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

    'default': function() {
      // log the request and respond with 406
      res.status(406).send('Not Acceptable');
    }
  });
});