我了解您可以通过以下方式提供静态内容:
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内容。
有更好的方法吗?
答案 0 :(得分:15)
你走在正确的轨道上。这是来自Express的关于使用req.accept:
的一个不错的exampleapp.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