Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 尽管我在服务器上指定了一个原点,为什么我总是得到一个不允许使用通配符*的cors错误?_Reactjs_Express_Cors_Graphql - Fatal编程技术网

Reactjs 尽管我在服务器上指定了一个原点,为什么我总是得到一个不允许使用通配符*的cors错误?

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

我用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: "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
。这是官方文件:这对我来说很有效。我想这应该是公认的答案,对我来说也很有用。