在Node.js上,当使用Jade作为模板渲染器时,res.render调用唯一可能的输出是HTML。
但它不会自动包含相应的Content-Type: text/html
标题。
这是设计的吗?如果是这样,是否有一种简单的方法可以实现这一点,而无需将此标题添加到所有路由?
答案 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();
});
在创建应用后立即执行此操作。