sailsjs cors 错误请求仍然通过控制器

sailsjs cors bad request still getting through to controller

所以我的 cors.js 文件看起来像

module.exports.cors = {
  allRoutes: true,
  origin: require('./local.js').hosts, // this is 'http://localhost'
}

然后我选择了一个随机站点来发出请求,在这种情况下:http://tools.pingdom.com/fpt/

这是我在页面上的请求和响应

$.post('http://localhost:1337/gift/create') Object {readyState: 1, getResponseHeader: function, getAllResponseHeaders: function, setRequestHeader: function, overrideMimeType: function…} jquery-2.1.1.min.js:4 POST http://localhost:1337/gift/create (index):1 XMLHttpRequest cannot load http://localhost:1337/gift/create. The 'Access-Control-Allow-Origin' header contains the invalid value ''. Origin 'http://tools.pingdom.com' is therefore not allowed access.

但是,我仍然在控制台中遇到错误,因为控制器函数仍然被调用。

sails> error: Sending 500 ("Server Error") response: 
TypeError: Cannot read property 'email' of undefined

我认为 cors 应该在连接失败时结束连接。

我是否缺少设置?

这是此 post CORS: preflight passes, main request completes w/200, but browser still has Origin error 的副本,但似乎没有解决。我们知道为什么 post 继续通过吗?

这是响应头

Access-Control-Allow-Credentials:true
Access-Control-Allow-Origin:
Connection:keep-alive
Content-Length:2
Content-Type:application/json; charset=utf-8
Date:Wed, 28 Jan 2015 15:56:51 GMT
Set-Cookie:sails.sid=s%3A5TJr82PCN-Tas2GrfKkhooEB.IWwc75iQUPRYoR7qWSep6xc%2BSLUkOV0IQe0w63GDYrQ; Path=/; HttpOnly
X-Powered-By:Sails <sailsjs.org>

没有设置访问控制允许来源。我可以为此制定政策,但这是 Sails 中的错误吗?

首先要注意的是:您永远不会遇到 500 错误,因为您应该在使用它们之前在控制器代码中验证这些字段!

至于尽管您的 CORS 设置仍在处理请求:您所看到的是预期的行为,但我理解您的困惑。以下是您必须了解的有关 CORS 和 POST 请求的内容:

POST 请求不会触发来自浏览器的预检请求,只要它们使用常见的内容类型 header,例如 application/x-www-form-urlencoded.

这是因为长期以来,常规的旧 HTML 表格被允许自由地 POST 到不同的来源。当您执行常规 jQuery $.post 时,它使用相同的内容类型,因此服务器无法将其与常规形式 POST 区分开来并允许它通过。 浏览器,在收到空的Access-Control-Allow-Origin header后,说"no way Jose"并拒绝显示响应,但那时船已经航行了- -POST 请求已处理。

如果您不希望 Sails 处理来自 non-whitelisted 来源的 any 请求,您可以将 CORS 配置中的 securityLevel 设置为1(高)或2(非常高):

module.exports.cors = {
  allRoutes: true,
  origin: require('./local.js').hosts, // this is 'http://localhost',
  securityLevel: 1
}

这将导致 Sails return 对来自不允许的域的任何请求作出 403 响应。 highvery high 之间的区别是 high 仍然允许来自不同协议的 cross-origin 请求(所以你的 Postman 请求仍然有效),而 very high 紧紧锁住一切。