Ниже вы можете видеть, что у меня есть сервер Apollo (используется express). В строках 33-39 я использую промежуточное программное обеспечение express для проверки токена аутентификации и (если токен действителен) устанавливаю _id пользователя на объект запроса.
В конструкторе сервера я устанавливаю контекст на вернуть req, а также _id в качестве userId. Я также пытался просто делать ({req}) => {..req}
.
Независимо от того, что я пытаюсь, я не получаю доступ к userId в контексте apollo. Я сделал простой обработчик запросов gql в Apollo, чтобы просто выйти из значения, и оно всегда не определено.
Кроме того, у меня есть простой маршрут REST (строки 43-49), который, кажется, отлично присоединяет userId к каждому запросу, поэтому что-то не соединяется, но я не уверен, где.
В конце дня моя цель - получить токен JWT от отправленной клиентом куком ie стороны, проверить его и добавить его в контекст, чтобы я мог получить доступ к значениям в моих преобразователях graphQL. Есть мысли?
index. js
const express = require('express');
const { ApolloServer } = require('apollo-server-express');
const bodyParser = require('body-parser');
const cors = require('cors');
const cookieParser = require('cookie-parser');
const jwt = require('jsonwebtoken');
require('dotenv').config();
const db = require('./db');
const User = require('./models/User');
const typeDefs = require('./gqlSchema');
const queries = require('./resolvers/queries');
const mutations = require('./resolvers/mutations');
const resolvers = {
Mutation: mutations,
Query: queries,
}
const app = express();
const corsOptions = {
origin: process.env.FRONTEND_URL,
credentials: true,
};
app.use(cors(corsOptions));
app.use(cookieParser());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
app.use((req, res, next) => {
const { token } = req.cookies;
if (token) {
const tokenData = jwt.verify(token, process.env.SECRET);
req._id = tokenData._id;
}
next();
})
//// TEMP REST LOGIN ////
const login = require('./controllers/login');
app.post('/auth/google', login);
app.post('/token', (req, res) => {
console.log('/token middlware req: ', req._id);
res.send('test token route')
})
///////////////////
const server = new ApolloServer({
typeDefs,
resolvers,
context: ({ req }) => ({
...req,
userId: req._id,
})
});
server.applyMiddleware({
app,
path: '/graphql',
cors: false,
});
app.listen({ port: 4000 }, () => {
console.log(`? Server ready at http://localhost:4000${server.graphqlPath}`);
})