node.js - 在 Express JS 中接受 CORS 请求的自定义 Http header

标签 node.js express http-headers cors

我有一个 ExpressJS 应用程序通过 REST 公开一些数据。当我从同源或使用curl访问REST接口(interface)时,一切都很好,并且我的自定义http header 被转发到我的路由。

但是当我尝试从另一个源访问 REST 接口(interface)时,我的 header 被删除。

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

在服务器端,自定义 header x-foo 不是 req.headers 的一部分。如果我使用以下curl命令我的标题存在

curl -H "x-foo: FooBar" -G http://localhost:3001/foo

不幸的是,我无法找到任何解决方案来启动并运行它。

最佳答案

你的线路

app.all('/', ...);

并没有做你可能认为它会做的事情。它处理所有传入请求。它只处理 / 的所有传入请求,无论使用什么动词。因此,all 表示所有动词,而不是所有路线。查看其 documentation了解详情。

因此,当您尝试使用 $.ajax 调用访问 /foo 时,您的 CORS 中间件不会被触发。也许这就是原因。至少这可以解释为什么它可以在 localhost 和 curl 上工作,但不能在使用不同域的浏览器中工作。

希望这有帮助。

PS:我建议不要编写自己的 CORS 中间件,而应使用现有的中间件。我在 node-cors 上获得了很好的体验.

关于node.js - 在 Express JS 中接受 CORS 请求的自定义 Http header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17467431/

相关文章:

mysql - node.js - 监听数据库变化并更新它们

node.js - mongoosejs findByIdAndUpdate 最好的方法

node.js - expressjs 项目中的 aws-sdk 错误-找不到模块'aws-sdk/lib/config_service_placeholders

node.js - nodejs multer 将存储的图像检索到客户端

javascript - 我可以通过 javascript 获取 HTTP 资源的 HTTP 过期 header 吗?

node.js - 如何用另一个 Node 脚本调用脚本?

mysql - Lambda AWS 不调用 Node mysql 回调

javascript - 如何使用 sailsjs-nodejs 连接/合并两个 json 对象

JavaScript 和重定向位置 : header detection

http - 获取 HTTP 响应的所有 header 并在下一个 HTTP 请求中发回