sailsjs cors糟糕的请求仍然通过控制器

时间:2015-01-28 15:43:52

标签: javascript node.js cors sails.js

所以我的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')对象{readyState:1,   getResponseHeader:function,getAllResponseHeaders:function,   setRequestHeader:function,overrideMimeType:function ...}   jquery-2.1.1.min.js:4 POST http://localhost:1337/gift/create   (索引):1 XMLHttpRequest无法加载   http://localhost:1337/gift/create。 ' Access-Control-Allow-Origin'   标头包含无效值''。起源   ' http://tools.pingdom.com'因此不允许访问。

但是,由于控制器功能仍然被调用,我仍然在控制台中出现错误。

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

如果失败,我认为cors应该结束连接。

我错过了一个设置吗?

这是此帖CORS: preflight passes, main request completes w/200, but browser still has Origin error的副本,但似乎并未解决。我们知道这个帖子为什么会继续经历吗?

这是响应标题

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>

没有access-control-allow-origin设置。我可以为此制定政策,但这是Sails中的错误吗?

1 个答案:

答案 0 :(得分:4)

首先要做的事情是:你永远不应该得到500错误,因为你应该在使用它们之前验证控制器代码中的那些字段!

尽管你的CORS设置仍在处理请求:你所看到的是预期的行为,但我同情你的困惑。以下是您对CORS和POST请求的理解:

POST请求不会触发浏览器的预检请求,只要他们使用application/x-www-form-urlencoded 等公共内容类型标头。

这样做的原因是,长期以来一直存在允许常规旧HTML表单自由POST到不同来源的情况。当您执行常规jQuery $.post时,它使用相同的内容类型,因此服务器无法将其与常规表单POST区分开来并让它通过。收到空的Access-Control-Allow-Origin标题后,浏览器会说&#34; Jose&#34;并且拒绝显示响应,但到那时船已经航行 - 该POST请求已被处理。

如果您不希望来自非白名单来源的任何请求由Sails处理,您可以将CORS配置中的securityLevel设置为1 (高)或2(非常高):

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

这将导致Sails对来自不允许的域的任何请求返回403响应。 highvery high之间的区别在于high仍然允许来自不同协议的跨源请求(因此您的Postman请求仍然有效),而very high把一切都锁紧。