Ответ с помощью пользовательского HTTP-кода с помощью GraphQL Yoga с распознавателя мутаций - PullRequest
0 голосов
/ 28 августа 2018

Я работаю над распознавателем мутаций, используя GraphQL Yoga и Prisma для моего бэк-энда. Мутация предназначена для выполнения аутентификации и возврата JWT при успешном входе в систему. Мутация в настоящее время выглядит так:

loginEmployer: async (_, args, context, info) => {
  const employer = await context.prisma.query.employer({
    where: {
      name: args.name,
    }
  })
  const match = await bcrypt.compare(args.password, employer.hashedPassword);
  if (match) {
    return jwt.sign(employer, jwtSecret);
  } else {
    return "";
  }
}

Алгоритм довольно прост, как вы можете видеть: найдите работодателя с совпадающим именем, сравните сохраненный хешированный пароль с входящим, используя bcrypt, и верните подписанный jwt, если есть совпадение. Довольно стандартные вещи.

Однако в случае, если совпадения нет или если работодатель не соответствует названию, я бы хотел ответить 403. В экспрессе я бы просто сделал res.status(403).send({error: "No such username/password"}), но с GraphQL Yoga, я немного потерян и не смог найти никакой документации о том, как это сделать.

Спасибо за любые ответы, разбирающие это или указывающие мне в правильном направлении:)

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

После @Lars Holdaas - мне потребовалось слишком много времени, чтобы выработать ответ. Но параметры контекста: request и response.

Если вы используете req / res, он не работает. Итак, более точный пример:

new GraphQLServer({ 
        typeDefs, 
        resolvers,
        context: ({ request, response, ...rest }) => {
          return { 
             req: request, 
             res: response, 
             userId: request.headers.userid
          };
        },
    })
0 голосов
/ 31 августа 2018

Абхи из призмы здесь!

В GraphQL Йога вы можете передать фабрику context, которая содержит запрос и ответ!

Вот пример!

new GraphQLServer({ typeDefs, resolvers, context: ({ req, res, ...rest }) => { // pass things down in context! return { req, res, userId: req.headers.userid }; }, })

Затем в вашем преобразователе просто вытяните res из объекта контекста.

Теперь это работает хорошо и хорошо, но вот проблема с github по поводу похожей вещи, у которой были некоторые другие мнения по этому поводу: https://github.com/graphql/express-graphql/issues/71

...