无法通过中间件获取添加到req对象的值

3

我已经配置了我的服务器,如下所示:

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;

这是一个使用Apollo Server 2.0和ExpressJS实现的GraphQL。然而,正如您所见,我正在使用自定义中间件在命中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] ] } }

发生了什么?


我不确定GraphQL,但是在中间件之间传递自定义变量的另一种方法是使用res.locals。您可能想要使用res.locals.isAuthres.locals._id - Anand Undavia
你找到解决方法了吗? - Dragos Strugar
1个回答

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 })
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接