Невозможно получить значение, добавленное к объекту запроса, через промежуточное программное обеспечение

#node.js #express #middleware #apollo-server

#node.js #экспресс #промежуточное программное обеспечение #apollo-сервер

Вопрос:

Мой сервер настроен таким образом:

 import express from 'express';
import { ApolloServer } from 'apollo-server-express';
import { typeDefs, resolvers } from './schema';
import playgroundSettings from './playground.json';
import isAuth from './middleware/isAuth';


// GraphQL: Schema
const server = new ApolloServer({
  typeDefs,
  resolvers,
  playground: {
    endpoint: '/blog', /* populates the playground endpoint box below the tab-strip. */
    settings: playgroundSettings,
  },
});

// Express: Initialize
const app = express();
// Middleware: isAuth
app.use(isAuth);
// Middleware: GraphQL route
server.applyMiddleware({
  app,
  path: '/',
});
// Express: Listener
app.listen(process.env.GRAPH_BLOG_PORT, () => {
  console.log(`Server started on port: ${process.env.GRAPH_BLOG_PORT}`);
});

// Exports
export default app;
  

Это реализация GraphQL с использованием Apollo Server 2.0 и ExpressJS. Однако, как вы можете видеть, я использую пользовательское промежуточное программное обеспечение для выполнения некоторых задач авторизации, прежде чем перейти к маршруту GraphQL. Это промежуточное программное обеспечение имеет имя isAuth.js и вызывается и выполняется, как ожидалось. Однако я почему-то не могу получить свойства, которые это промежуточное программное обеспечение добавляет к моему объекту req, из преобразователя. Промежуточное программное обеспечение выглядит следующим образом:

 // isAuth.js
import jwt from 'jsonwebtoken';

module.exports = (req, res, next) => {
  let decodedToken;
  const authHeader = req.get('Authorization');
  if (!authHeader) {
    req.isAuth = false;
    return next();
  }
  const token = authHeader.split(' ')[1];
  if (!token || token === '') {
    req.isAuth = false;
    return next();
  }
  try {
    decodedToken = jwt.verify(token, process.env.GRAPH_BLOG_JWT_SECRET);
  } catch (err) {
    req.isAuth = false;
    return next();
  }
  if (!decodedToken) {
    req.isAuth = false;
    return next();
  }
  req.isAuth = true;
  req._id = decodedToken._id;
  return next();
};
  

И когда я делаю console.log(req); в своем распознавателе, я ожидаю такие свойства, как isAuth и _id , но вместо этого получаю следующее:

 { _extensionStack:
   GraphQLExtensionStack {
     extensions: [ [FormatErrorExtension], [CacheControlExtension] ] } }
  

Что происходит?

Комментарии:

1. Я не уверен насчет GraphQL, но еще один способ передачи пользовательских переменных через промежуточные программы — использовать res.locals . Возможно, вы захотите использовать res.locals.isAuth и res.locals._id

2. Вы нашли обходной путь?

Ответ №1:

Вам нужно добавить контекстную строку, как показано ниже:

 const server = new ApolloServer({
  typeDefs,
  resolvers,
  playground: {
    endpoint: '/blog', /* populates the playground endpoint box below the tab-strip. */
   settings: playgroundSettings,
 },
 context: ({ req, res }) => ({ req, res })
});