web-dev-qa-db-fra.com

problème CORS apollo-server-express

Je migre donc vers apollo-server-express 2.3.3 (j'utilisais 1.3.6) J'ai suivi plusieurs guides, faisant les ajustements nécessaires mais je suis coincé dans un problème CORS.

Selon le docs vous devez utiliser la fonction applyMiddleware pour câbler le serveur apollo avec express.

Je fais actuellement ce qui suit:

const app = express();

// CORS configuration

const corsOptions = {
    Origin: 'http://localhost:3000',
    credentials: true
}

app.use(cors(corsOptions))

// Setup JWT authentication middleware

app.use(async (req, res, next) => {
    const token = req.headers['authorization'];
    if(token !== "null"){
        try {
            const currentUser = await jwt.verify(token, process.env.SECRET)
            req.currentUser = currentUser
        } catch(e) {
            console.error(e);
        }
    }
    next();
});

const server = new ApolloServer({ 
    typeDefs, 
    resolvers, 
    context: ({ req }) => ({ Property, User, currentUser: req.currentUser })
});

server.applyMiddleware({ app });


const PORT = process.env.PORT || 4000;

app.listen(PORT, () => {
    console.log(`Server listening on ${PORT}`);
})

Pour une raison quelconque, mon middleware express ne semble pas être en cours d'exécution, lorsque j'essaie de faire une demande de localhost: 3000 (application cliente), j'obtiens l'erreur CORS typique

Avec apollo-server-express 1.3.6, je faisais ce qui suit sans aucun problème:

app.use(
    '/graphql',
    graphqlUploadExpress({ maxFileSize: 10000000, maxFiles: 10 }),
    bodyParser.json(),
    graphqlExpress(({ currentUser }) => ({
        schema,
        context: {
            // Pass Mongoose models
            Property,
            User,
            currentUser
        }
    }))
);

Maintenant, avec la nouvelle version, même si les documents font que cela ressemble à une migration simple, il ne semble pas que cela fonctionne. J'ai vérifié divers articles et personne ne semble avoir le problème.

J'espère que vous pourrez m'aider.

À votre santé!

5
José Del Valle

Les paramètres CORS proviennent d'ExpressJS, pas d'ApolloServer. Si vous souhaitez ajouter une origine personnalisée ou générique, vous devez la gérer avec une fonction de rappel/gestionnaire.

const server = new ApolloServer({
    ....,
    cors: {
        credentials: true,
        Origin: (Origin, callback) => {
            const whitelist = [
                "http://site1.com",
                "https://site2.com"
            ];

            if (whitelist.indexOf(Origin) !== -1) {
                callback(null, true)
            } else {
                callback(new Error("Not allowed by CORS"))
            }
        }
    }
});
1
Alexander Gavazov