Выполнено express Требуется не на сервере apollo- express - PullRequest
1 голос
/ 01 апреля 2020

Ниже вы можете видеть, что у меня есть сервер 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}`);
})
...