1

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

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

这是设计使然吗?如果是这样,是否有一种简单的方法可以在不将此标头添加到所有路由的情况下实现这一点?

4

3 回答 3

7

那要看你怎么用玉了。玉只为您渲染,它不知道渲染内容的适当标题。

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

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

于 2013-10-17T03:52:45.863 回答
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
于 2013-10-17T03:56:33.697 回答
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();
});

在创建您的应用程序后执行此操作。

于 2013-10-17T03:48:25.023 回答