hapi.js Cors Pre-flight不返回Access-Control-Allow-Origin标题

我有一个使用(Dropzone js)的ajaxfile upload。 将文件发送到我的hapi服务器。 我意识到浏览器发送了一个PREFLIGHT OPTIONS METHOD。 但我的hapi服务器似乎不发送正确的响应头,所以我得到铬上的错误。 这是我在铬上得到的错误

XMLHttpRequest cannot load http://localhost:3000/uploadbookimg. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:4200' is therefore not allowed access. 

这是hapi js路由处理程序

 server.route({ path: '/uploadbookimg', method: 'POST', config: { cors : true, payload: { output: 'stream', parse: true, allow: 'multipart/form-data' }, handler: require('./books/webbookimgupload'), } }); 

根据我的理解,hapi js应该发送来自Pre-fight(OPTIONS)请求的所有Cors头文件。 不能明白为什么它不是

来自chrome的networking请求/响应

 **General** Request Method:OPTIONS Status Code:200 OK Remote Address:127.0.0.1:3000 **Response Headers** view parsed HTTP/1.1 200 OK content-type: application/json; charset=utf-8 cache-control: no-cache vary: accept-encoding Date: Wed, 27 Apr 2016 07:25:33 GMT Connection: keep-alive Transfer-Encoding: chunked **Request Headers** view parsed OPTIONS /uploadbookimg HTTP/1.1 Host: localhost:3000 Connection: keep-alive Pragma: no-cache Cache-Control: no-cache Access-Control-Request-Method: POST Origin: http://localhost:4200 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.87 Safari/537.36 Access-Control-Request-Headers: accept, cache-control, content-type Accept: */* Referer: http://localhost:4200/books/upload Accept-Encoding: gzip, deflate, sdch Accept-Language: en-US,en;q=0.8 

提前致谢

hapi cors: true是一个通配符规则,它允许来自所有域的CORS请求,除了less数情况外,包括当hapi的默认白名单外还有额外的请求头时:

["accept", "authorization", "content-type", "if-none-match", "origin"]

请参阅路线选项下的API文档中的cors选项部分 :

headers – 允许头headers的string数组('Access-Control-Allow-Headers')。 默认为['Accept', 'Authorization', 'Content-Type', 'If-None-Match']

additionalHeaders – 额外头文件的string数组。 使用这个来保持默认的头文件。

你的问题是,Dropzone发送了一些头文件以及不在这个列表中的file upload:

  • x-requested-with (不在你的头文件中,而是发给我)
  • cache-control

你有两个select让事情能够正常工作,你需要在服务器或者客户端上改变一些东西:

选项1 – 白名单额外的标题:

 server.route({ config: { cors: { origin: ['*'], additionalHeaders: ['cache-control', 'x-requested-with'] } }, method: 'POST', path: '/upload', handler: function (request, reply) { ... } }); 

选项2 – 告诉dropzone不发送这些额外的头文件

尚不可能通过他们的configuration,但有一个待决的PR允许它: https : //github.com/enyo/dropzone/pull/685

我想加上我的2美分,因为上述没有完全解决我的情况这个问题。

我在localhost:3300启动了Hapi-Server。 然后我从localhost:80http://localhost:3300/发出一个请求来testingCORS。 这导致铬仍然阻止资源,因为它说

请求的资源上没有“Access-Control-Allow-Origin”标题

(这根本不是真的)。 然后,我改变了XHR-Request来获取URL到我实际上在HapiJS中创build了一个path,在我的情况下是http://localhost:3300/api/test这工作

为了解决这个问题,我在HapiJS中创build了一个“全部通过”的路线(以覆盖内置的404 catch)。

 const Boom = require('Boom'); //You can require Boom when you have hapi Route({ method: '*', path: '/{any*}', handler: function(request, reply) { reply(Boom.notFound()); } })