有条件的网页服务基于“接受”标题与快递?

时间:2014-04-28 22:02:49

标签: node.js express http-headers

我了解您可以通过以下方式提供静态内容:

app.use(express.static(__dirname + "../../../public_html"));

但是,我试图根据响应发送的“Accept”标题明确更改它提供的内容的表示。通常,我通过REST API以JSON格式请求我拥有的内容,因此网址为:http://blah.com/this/that/item并且运行良好。

但是,我还希望用户能够从浏览器访问同一页面,该浏览器将发送类似:Accept:text/html的内容,并且由于该标题,请查看格式正确的页面(CSS / JS) / HTML / etc)提供相同的信息。

现在,我正试图通过以下方式提供内容:

if (req.accepts("text/html")) {
   res.sendfile("/", {
      root: "../../../public_html"
   });
   res.status(200);
   return;
}

public_html持有index.html以及CSS和JS的相对目录。我不会在完成后发送该文件,但我认为这将是一个良好的开端,然后在我弄清楚如何基于Accept标头提供静态内容之后添加JSON内容。

有更好的方法吗?

2 个答案:

答案 0 :(得分:15)

你走在正确的轨道上。这是来自Express的关于使用req.accept:

的一个不错的example
app.use(function(req, res, next){
  res.status(404);

  // respond with html page
  if (req.accepts('html')) {
    res.render('404', { url: req.url });
    return;
  }

  // respond with json
  if (req.accepts('json')) {
    res.send({ error: 'Not found' });
    return;
  }

  // default to plain-text. send()
  res.type('txt').send('Not found');
});

<强>更新

您可以使用res.send发送文件而不进行渲染:

res.set('Content-Type', 'text/html');
res.send(new Buffer(fs.readFile(__dirname + 'index.html'));

答案 1 :(得分:11)

你可以使用res.format做同样的事情。来自明文档的例子:

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

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

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

您可以在此处详细了解:http://expressjs.com/en/api.html#res.format