接受 Express JS 中 CORS 请求的自定义 Http 标头
Posted
技术标签:
【中文标题】接受 Express JS 中 CORS 请求的自定义 Http 标头【英文标题】:Accept custom HttpHeaders for CORS requests in ExpressJS 【发布时间】:2013-07-02 06:58:26 【问题描述】:我有一个 ExpressJS 应用程序通过 REST 公开一些数据。当我从同一来源或使用 curl 访问 REST 接口时,一切都很好,我的自定义 http 标头被转发到我的路由。
但是当我尝试从另一个来源访问 REST 接口时,我的标题被删除。
expressjs的配置是这样的
app.use(express.bodyParser());
var allowCrossDomain = function(req, res, next)
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Methods', 'GET');
res.header('Access-Control-Allow-Headers', 'Accept');
if ('OPTIONS' == req.method)
res.send(200);
else
next();
;
app.all('/',allowCrossDomain);
app.get('/foo', function(req,res)
console.dir(req.headers);
);
我尝试使用以下 JS 代码访问 api
var properties =
url: 'http://localhost:3001/foo?callback=?,
type: 'GET',
dataType: 'jsonp',
headers: "x-foo" : "FooBar"
;
$.ajax(properties).done(onSuccess).fail(function(r, s, e)
console.log(e);
);
在服务器端,自定义标头 x-foo 不是 req.headers 的一部分。如果我使用以下 curl 命令,我的标题存在
curl -H "x-foo: FooBar" -G http://localhost:3001/foo
很遗憾,我找不到任何解决方案来启动和运行它。
【问题讨论】:
【参考方案1】:你的线路
app.all('/', ...);
不做你认为它做的事。它确实不处理所有传入的请求。它只处理对/
的所有传入请求,而不管使用的动词如何。因此,all
表示所有动词,而不是所有路线。详情请见其documentation。
因此,当您尝试使用 $.ajax
调用访问 /foo
时,不会触发您的 CORS 中间件。也许这可能是原因。至少这可以解释为什么它可以在 localhost 和 curl
中工作,但不能在使用不同域的浏览器中工作。
希望这会有所帮助。
PS:我建议不要编写自己的 CORS 中间件,而是使用现有的。我对node-cors 的体验非常好。
【讨论】:
以上是关于接受 Express JS 中 CORS 请求的自定义 Http 标头的主要内容,如果未能解决你的问题,请参考以下文章
允许对 express/node.js 应用程序的 CORS REST 请求
在 Node.js Express.js 服务器中添加标头后,Chrome 中仍然出现 CORS 错误
Express、Socket.io 和 Nginx 的 CORS 问题