【发布时间】:2018-12-09 09:58:15
【问题描述】:
我正在使用 Node JS 和 Hapi (v17) 编写 BE 应用程序。在服务器运行时,我尝试使用 POST 方法调用端点,但我不断收到错误消息:
Failed to load http://localhost:8001/login: 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:3000' is therefore not allowed access.
我想在服务器站点上启用CORS,但对我没有任何帮助。
这是我在服务器站点上启用 CORS 的方法:
const hapi = require('hapi')
const server = hapi.server({
port: 8001,
host: 'localhost',
routes: {
cors: true
}
})
我也尝试为特定路线启用 cors,但这也没有效果:
server.route({
method: 'POST',
path: '/login',
config: {
cors: {
origin: ['*'],
additionalHeaders: ['cache-control', 'x-requested-with']
}
},
handler: async (request, reply) => {
return User.login(request, reply)
}
})
有谁知道我应该怎么做才能启用 CORS 并解决问题?
另外,还有一张来自浏览器网络标签的截图:
编辑:
我添加了处理OPTIONS 方法的路由,现在我遇到了另一个问题。
Failed to load http://localhost:8001/login: Request header field access-control-allow-credentials is not allowed by Access-Control-Allow-Headers in preflight response.
下面是网络标签中的样子:
【问题讨论】:
-
“预检请求” 表示一个 OPTIONS 请求(如您的请求屏幕截图所示)。所以你需要为这种类型的请求设置一个路由配置。
-
好的,我可以定义一个新的路由来处理
OPTIONS方法,但是这样的路由的响应应该是什么? -
没什么,内容无关紧要,浏览器只看标题就知道是否允许进行实际请求
-
Access-Control-Allow-Credentials是一个 response 标头 - 那么为什么它在您的Access-Control-Request-Headers请求标头中 - 请显示发出请求的客户端代码 - 显然是你在请求中重新放入响应头 -
@JaromandaX 好点。从请求中删除此标头后,一切正常。谢谢,伙计们。
标签: javascript node.js web-services cors hapijs