If you app runs on :3000 and you try to make an HTTP request to a GraphQL server, that runs on :3001, you'll get a CORS error:
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:3001/graphql. (Reason: CORS header ‘Access-Control-Allow-Origin’ missing). Status code: 405.
Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:3001/graphql. (Reason: CORS request did not succeed). Status code: (null).
In order to fix this, you'll need to stop calling external web server from client and call the :3000 instead. The problem is that you still need to proxy your GraphQL requests from :3000 to :3001.
In Next.js you can use rewrites for it. Update the next.config.js file like this:
const nextConfig = {
reactStrictMode: true,
async rewrites() {
return [
{
source: '/api/graphql',
destination: 'http://localhost:3001/graphql'
}
]
}
}Rebuild the app to apply the configuration changes.
Now, when you call a GraphQL server with the ApolloClient like this:
const apolloClient = new ApolloClient({
uri: "http://localhost:3000/api/graphql",
cache: new InMemoryCache()
})your requests will be redirected to the http://localhost:3001/graphql.
The reason why I'm doing so is because my GraphQL server is running with Deno (:3001) and the UI app with Next.js (:3000).
Another solution is to make your GraphQL server a part of your Next.js app.
References: