Javascript 如何在apollo server中将用户添加到上下文对象?

Javascript 如何在apollo server中将用户添加到上下文对象?,javascript,node.js,authentication,graphql,apollo-server,Javascript,Node.js,Authentication,Graphql,Apollo Server,当我使用RESTAPI时,我曾经将用户放在req.user上,但现在我正在做我的第一个graphql验证,我很难将用户放在上下文对象上 以下是我试图完成但不起作用的目标: 从令牌获取管理员ID并从数据库获取管理员 将获取的管理员添加到上下文对象,以便我可以在每个解析器之前检查管理员权限 context中的admin的值是Promise{}上下文函数本身可以返回一个Promise。您可以使函数异步或使用链接API: 从“/auth”导入{validateAccessToken}; const se

当我使用RESTAPI时,我曾经将用户放在req.user上,但现在我正在做我的第一个graphql验证,我很难将用户放在上下文对象上

以下是我试图完成但不起作用的目标:

  • 从令牌获取管理员ID并从数据库获取管理员
  • 将获取的管理员添加到上下文对象,以便我可以在每个解析器之前检查管理员权限

  • context
    中的
    admin
    的值是
    Promise{}

    上下文函数本身可以返回一个Promise。您可以使函数异步或使用链接API:

    从“/auth”导入{validateAccessToken};
    const server=新服务器({
    模块:[auth],
    上下文:async({req,res})=>({req,res,admin:await validateAccessToken(req)}),
    });
    const server=新服务器({
    模块:[auth],
    上下文:({req,res})=>
    validateAccessToken(req).then(admin=>({req,res,admin})),
    });
    
    现在,admin应该是上下文的一部分,不再是一个待定的承诺

    export const validateAccessToken = async (req) => {
      try {
        const accessToken = req.headers.authorization.slice(7);
        if (!accessToken) throw new AuthenticationError('Unauthorized access');
    
        const { id } = verify(accessToken, process.env.JWT_ACCESS_SECRET);
    
        const admin = await Admin.findById(id);
    
        return admin;
      } catch {
        return null;
      }
    };
    
    // index.js
    import { validateAccessToken } from './auth';
    
    const server = new ApolloServer({
        modules: [auth],
        context: ({ req, res }) => ({ req, res, admin: validateAccessToken(req) }),
      });