Как проверить электронную почту пользователя при использовании GraphQl и Node.js

Я пытаюсь реализовать проверку электронной почты пользователя в своем любимом проекте с помощью GraphQL и Node.js.

У меня уже есть преобразователь signUp, который отправляет токен подтверждения, но я только что понял, что когда пользователь щелкает ссылку, нет возможности отправить данные из электронной почты следующему преобразователю GraphQL, который будет использовать токен и проверять электронную почту.

Итак, вопрос: сделать ли мне конечную точку REST /verify для выполнения работы или есть способ использовать конечную точку /graphql


person Andrew Carbon    schedule 05.04.2019    source источник
comment
Если у вас уже есть сервер GraphQL, нет необходимости реализовывать конечные точки REST. Просто постоянно используйте запросы/мутации GraphQL.   -  person Marco Daniel    schedule 05.04.2019


Ответы (1)


Если вы используете отдельную конечную точку /verify, вы, скорее всего, также захотите перенаправить пользователя обратно на ваш сайт после обработки запроса. Один из подходов состоит в том, чтобы эффективно изменить этот поток, создав ссылку на ваш веб-сайт, а затем заставить вашу страницу сделать необходимый запрос GraphQL.

Кроме того, вы можете вызвать свой преобразователь verify по ссылке в электронном письме. express-graphql будет обрабатывать запросы POST и GET. Однако при таком подходе следует помнить о нескольких вещах:

  • Он будет работать только с запросами, поэтому ваше поле «проверить» должно быть типа запроса.
  • Запрос будет работать в контексте браузера, но полностью завершится ошибкой, если вы вызовете его изнутри, например, GraphiQL.

Вот простой пример:

const typeDefs = `
  type Query {
    verify: Boolean # Can be any nullable scalar
  }
`
const resolvers = {
  Query: {
    verify: (root, args, ctx) => {
      // Your verification logic
      ctx.res.redirect('https://www.google.com')
    }
  }
}
const schema = makeExecutableSchema({ typeDefs, resolvers })

app.use('/graphql', graphqlHTTP((req, res) => ({
  schema: MyGraphQLSchema,
  graphiql: false,
  // Inject the response object into the context
  context: { req, res },
})))

app.listen(4000)

Затем вы можете просто перейти по этому URL-адресу в своем браузере:

http://localhost:4000/graphql?query={verify}
person Daniel Rearden    schedule 05.04.2019
comment
Привет, Даниэль, это работает, однако выдает ошибку Ошибка [ERR_HTTP_HEADERS_SENT]: невозможно установить заголовки после их отправки клиенту. Я использую epress и graphql, которые перенаправляют браузер в соответствующее место, но выдают эту ошибку на моем экспресс-сервере. - person Graig Peru; 12.01.2020
comment
есть ли способ предотвратить это? - person Graig Peru; 12.01.2020
comment
Нет. Ваш сервис GraphQL действительно не должен использоваться таким образом — просто используйте отдельную конечную точку. - person Daniel Rearden; 12.01.2020