如何让Express在使用res.render时自动设置Content-Type?

时间:2013-10-17 03:18:26

标签: javascript node.js express

在Node.js上,当使用Jade作为模板渲染器时,res.render调用唯一可能的输出是HTML。

但它不会自动包含相应的Content-Type: text/html标题。

这是设计的吗?如果是这样,是否有一种简单的方法可以实现这一点,而无需将此标题添加到所有路由?

3 个答案:

答案 0 :(得分:3)

这取决于你如何使用玉。 jade只为你做渲染,它不知道渲染内容的适当标题。

res.setHeader('Content-Type', 'text/html'); //or text/plain
res.render('yourtemplate');

您应该选择最适合您的标题。

答案 1 :(得分:1)

我写了一个演示应用来强制Content-Type: text/html获取所有请求。然后我尝试禁用设置该标题的函数,并且该标题仍出现在我的回复中 - 所以它确实似乎默认设置为我。

您确定没有设置Content-Type吗?什么版本的快递以及您如何查看标题?我在Express 3.4.1和Chromium

// app.js
var express = require('express');
var app = express();

function setHTML(req, res, next){
  res.header('Content-Type', 'text/html');
  next();
};

app.set('views', __dirname);
app.set('view engine', 'jade');
app.use(app.router);

//app.get('*', setHTML);
app.get('/', function(req, res){
  res.render('template');
});

require('http')
.createServer(app)
.listen(3000, function(){
  console.log('Listening on 3000');  
})

// template.jade
!!!
html
  body
    h1 hello thar

//response headers
HTTP/1.1 200 OK
X-Powered-By: Express
Content-Type: text/html; charset=utf-8
Content-Length: 60
Date: Thu, 17 Oct 2013 03:50:46 GMT
Connection: keep-alive

答案 2 :(得分:0)

你可以覆盖res.render方法

app.use(function(req, res, next){

    var oldRender = res.render;
    res.render = function(){
        res.header('Content-Type', 'text/html');
        oldRender.apply(this, arguments);
    };

    next();
});

在创建应用后立即执行此操作。