36

我有一些使用 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');
});

谢谢。

4

2 回答 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 匹配时设置标题。

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 }));
});

注意:中间件需要在路由之前才能生效,也就是说你不能把中间件放在静态中间件之后。

于 2013-01-05T13:55:45.163 回答
4

其他方式 :

app.use(express.static(
    path.join(application_root, "StaticPages"),
    {
        setHeaders: (res) => {
            res.setHeader('Access-Control-Allow-Origin', '*')
        }
    }
))
于 2017-08-30T15:37:34.527 回答