使用Express.JS发送附加的HTTP头信息

37

我有一些通过Express.JS提供的静态页面。设置很容易:

var app = express();

app.configure(function(){
  app.use(express.static(path.join(application_root, "StaticPages")));
  app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});

我希望响应包括一个额外的http头(Access-Control-Allow-Origin:*),它应该放在哪里? 我尝试了下面的示例,但是这个头只出现在默认页面上:

app.get('/', function(req, res){
  res.setHeader("Access-Control-Allow-Origin", "*");
  res.send('Hello World');
});

谢谢。


1
对于那些想要在路由上设置自定义标头但res.setHeader未定义的人,请使用res.setres.header。http://expressjs.com/en/api.html#res.set - AndyPerlitch
2个回答

54

我尝试了下面的示例,但是标题当然只出现在默认页面上。

是的,那是因为您仅为GET /路由定义了它,而不是其他路径。您应该使用中间件。

如果您希望为所有请求设置标题:

app.configure(function(){
  app.use(function(req, res, next) {
    res.setHeader("Access-Control-Allow-Origin", "*");
    return next();
  });
  app.use(express.static(path.join(application_root, "StaticPages")));
  app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});

如果你只想针对静态文件夹进行操作,那么就没有通用的方法。你可以尝试更改express.static(它来自connect.static)。另一种方法是匹配url并在匹配到url时设置header。

app.configure(function(){
  app.use(function(req, res, next) {
    var matchUrl = '/StaticFolder';
    if(req.url.substring(0, matchUrl.length) === matchUrl) {
      res.setHeader("Access-Control-Allow-Origin", "*");
    }
    return next();
  });
  app.use(express.static(path.join(application_root, "StaticPages")));
  app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
});

注意: 中间件需要放置在路由之前才能生效,换句话说,您不能在静态中间件之后放置中间件。


1
在静态资源中,setHeaders 函数用于设置与文件一起服务的 HTTP 标头。请参考 http://expressjs.com/en/4x/api.html#express.static。 - Green
你可以在静态中间件之后添加一个处理程序,该处理程序设置头部而无需使用 app.use 进行 URL 子字符串匹配,从而减少开销。 - Kelstar

5

另一种方式:

app.use(express.static(
    path.join(application_root, "StaticPages"),
    {
        setHeaders: (res) => {
            res.setHeader('Access-Control-Allow-Origin', '*')
        }
    }
))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接