Javascript Access Control Allow Origin不是*但Chrome坚持是(升级apollo服务器后)

Javascript Access Control Allow Origin不是*但Chrome坚持是(升级apollo服务器后),javascript,cors,apollo,Javascript,Cors,Apollo,我想从apollo server中获得一些功能,并花了一些时间对代码进行重构(以前使用的是express graphql)。现在唯一的问题是我的web应用程序(使用阿波罗客户端)之间的“CORS”问题。我记得在版本1.x中也遇到过这个问题,并且花了很多时间来解决它,但是我以前的解决方案在2.x中不起作用,如果有人能够帮助我解决这个问题,我将不胜感激 我的webapp托管在localhost:8081 我的服务器托管在localhost:4000 根据他们的代码,我有以下内容: 客户端代码 服

我想从apollo server中获得一些功能,并花了一些时间对代码进行重构(以前使用的是
express graphql
)。现在唯一的问题是我的web应用程序(使用阿波罗客户端)之间的“CORS”问题。我记得在版本1.x中也遇到过这个问题,并且花了很多时间来解决它,但是我以前的解决方案在2.x中不起作用,如果有人能够帮助我解决这个问题,我将不胜感激

  • 我的webapp托管在
    localhost:8081
  • 我的服务器托管在
    localhost:4000
根据他们的代码,我有以下内容:

客户端代码 服务器代码 当客户端通过查询后端时<代码>阿波罗客户端,我在Chrome中遇到以下错误:

然而,在我的服务器代码中,我显式地设置了原点。当我在控制台中检查网络请求时,我得到了一个相互矛盾的故事,并且
访问控制允许原点
显式设置为
http://localhost:8081


在使用失眠查询后端服务器并获得预期结果时,我没有遇到这个问题。有没有人有过在客户端和服务器上设置apollo并在本地主机上成功进行身份验证的经验?

我实际上是个哑巴。我看到了错误的响应,sideshowbarker发现了它,
apollo-server-v2
自动覆盖CORS,并默认将
Access Control Allow Origin
标题设置为*。即使您的express应用程序指定CORS并将其作为中间件应用于阿波罗服务器,此设置也将被
GraphQL
路由覆盖。如果有人面临这个问题,希望这能节省一些时间:

现在,您可以在其
applyMiddleware
方法中明确指定阿波罗服务器的CORS:

如果您安装了任何浏览器扩展,您可能希望禁用它们并重试。特别是,如果您安装了一些CORS插件/扩展。@sideshowbarker,我在匿名中也会遇到同样的错误,所以我要明确一点:您是否安装了任何CORS插件/扩展?如果是这样,你确定当你处于隐姓埋名模式时它实际上被禁用了吗?因为某些扩展实际上仍然可以在匿名模式下启用。因此,如果您确实安装了CORS插件/扩展,确保其不处于活动状态的唯一方法是手动禁用或删除它。我安装了Chromium的新副本,并出现了相同的错误,因此我相当确定没有安装插件/扩展。就我所知,这里唯一可能的原因是apollo客户端库中有一些代码在向浏览器引擎公开之前将头值更改为通配符。我对apollo一点也不熟悉,但除非你能在浏览器中直接复制(尤其是在Firefox、Safari或Edge中),否则你似乎需要在apollo库代码的某个地方寻找原因。先生,你是我的英雄。这正是我在看到cors在移除apollo后按预期工作,并将带有cors的中间件应用于false修复它之后得出的结论。谢谢你。浪费了几乎一整天的时间解决这个问题,找到了这个解决方案。
const client = new ApolloClient({
    link: createHttpLink({
        uri: 'http://localhost:4000/graphql', 
        credentials: 'include'
    })
})
// Initializing express app code 
var app = ....
// Using cors
app.use(cors({
    credentials: true, 
    origin: 'http://localhost:8081',
}));

// Apollo Server create and apply middleware
var apolloServer = new ApolloServer({ ... });
apolloServer.applyMiddleware({ app })