如何将用户添加到 apollo 服务器的上下文对象中?

How to add user to the context object in apollo server?

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

这是我正在尝试完成但不起作用的内容:

  1. 从令牌中获取管理员 ID 并从数据库中获取管理员
  2. 将获取的管理员添加到上下文对象,以便我可以在每个解析器之前检查管理员权限
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) }),
  });

admincontext中的值为Promise { <pending> }

上下文函数可以 return 承诺本身。您可以使函数异步或使用链接 API:

import { validateAccessToken } from './auth';

const server = new ApolloServer({
  modules: [auth],
  context: async ({ req, res }) => ({ req, res, admin: await validateAccessToken(req) }),
});


const server = new ApolloServer({
  modules: [auth],
  context: ({ req, res }) =>
    validateAccessToken(req).then(admin => ({ req, res, admin })),
});

现在 admin 应该是上下文的一部分,不再是待处理的承诺。