Reactjs 尽管我在服务器上指定了一个原点,为什么我总是得到一个不允许使用通配符*的cors错误?
我用Apollo服务器和Apollo客户端创建了一个简单的graphQL聊天 它还使用会话cookies,因此我使用npm包Reactjs 尽管我在服务器上指定了一个原点,为什么我总是得到一个不允许使用通配符*的cors错误?,reactjs,express,cors,graphql,Reactjs,Express,Cors,Graphql,我用Apollo服务器和Apollo客户端创建了一个简单的graphQL聊天 它还使用会话cookies,因此我使用npm包cors初始化服务器,如下所示: app.use( cors({ credentials: true, origin: "http://localhost:3000" }) ); const httpLink = new HttpLink({ uri: "http://localhost:4000/graphql", credentials
cors
初始化服务器,如下所示:
app.use(
cors({
credentials: true,
origin: "http://localhost:3000"
})
);
const httpLink = new HttpLink({
uri: "http://localhost:4000/graphql",
credentials: "include"
});
在客户端,我使用apollo client并创建如下http链接:
app.use(
cors({
credentials: true,
origin: "http://localhost:3000"
})
);
const httpLink = new HttpLink({
uri: "http://localhost:4000/graphql",
credentials: "include"
});
因此,我包含凭据,服务器具有我的客户端的来源(实际上是-create-react-app-default)
当我要运行查询时,我在浏览器控制台中遇到以下错误:
CORS策略已阻止从源“”获取“”的访问:当请求的凭据模式为“包括”时,响应中“访问控制允许源”标头的值不得为通配符“*”
为什么它说响应头有一个通配符*集,但在cors上我设置了一个特定的原点,所以它不应该是通配符,对吗
伙计们,我错过了什么?当然,我也重新启动了这两台服务器
当我这样设置客户端时:
const httpLink = new HttpLink({
uri: "http://localhost:4000/graphql",
credentials: "same-origin"
});
我没有从cors收到错误消息,但我没有从服务器收到cookie。Cookies之所以有效,是因为在graphQL游乐场上,一切都按预期进行
如果要查看完整代码:问题已解决 在服务器的my
index.js
文件中。
下面几行我将express app作为中间件应用于apollo服务器实例,如下所示:
server.applyMiddleware({app})代码>
但这会覆盖我上面设置的cors选项
所以我必须这样称呼它:server.applyMiddleware({app,cors:false})代码>
现在一切都正常了:)您可以告诉Apollo服务器如何配置cors
const corsOptions = {
origin: "http://localhost:3000",
credentials: true
}
server.applyMiddleware({
app,
cors: corsOptions
})
然后您可以完全消除express cors中间件。这只是关闭cors。更好的解决方案是在包中为本地开发设置代理。json“proxy”:http://localhost:4000/“,
,它告诉您如何通过应用程序对代理端口4000进行响应以进行开发。对于生产,您需要将服务器和前端捆绑在一起。它真的关闭了吗?因为这意味着凭据不会传递给客户端?所以饼干不起作用,但它们是这样做的?我是否在create react app文件夹的package.json或服务器的package.json中设置了这个代理?是的,cors:false
正在关闭cors,这与凭据或cookie无关。这是一种安全保护,在这里有更好的解释:对于代理,在我设置此代理时,您将其放在react package.json.Ok中。我下一步到底要做什么。使用cors包启用cors,如下所示:app.use(cors({credentials:true,origin:[)http://localhost:3000"] }) );
并在apollo服务器实例上设置cors:true
?在客户端上,我可以设置{credentials:“同源”}
?这样对吗?编辑:不以这种方式工作<代码>同源
有效,但没有cookie<代码>包含与通配符相同的cors错误。您不必在任何一侧显式执行任何操作,只需在react一侧设置代理,它将命中http://localhost:4000
就好像它击中了http://localhost:3000
。这是官方文件:这对我来说很有效。我想这应该是公认的答案,对我来说也很有用。