Как исправить отправку ошибок на веб-интерфейс с сервера Apollo - PullRequest
0 голосов
/ 19 апреля 2020

Я пытаюсь сделать регистрационную форму с помощью Apollo и React, и у меня возникает проблема с обработкой ошибок после запроса.

Проблема возникает следующим образом: Когда я пытаюсь зарегистрировать пользователя, который Я уже получаю сообщение об ошибке в консоли That username is already in use!, но ошибка, которую отправляет мой сервер:

GraphQL error: Cannot return null for non-nullable field Mutation.registerUser.

Это происходит, когда я пытаюсь вернуть что-то только в случае успеха.

Если я пытаюсь вернуть что-либо в любом случае, я получаю сообщение об ошибке на консоли, но frontend получает его как успешное, и происходит следующее logi c (в моем случае перенаправление на другую страницу)

Я пытаюсь выяснить, каким образом правильно отправить сообщение об ошибке на веб-интерфейс? Потому что верно, не все ошибки выдаются на сервер, и я вижу их только в своей консоли, но Apollo отправляет разные ошибки.

Это код, который у меня есть

typeDefs.ts

module.exports = gql`
  type Response {
    message: String!
  }
  input RegisterInput {
    username: String!
    password: String!
  }
  type Mutation {
    registerUser(registerInput: RegisterInput): Response!
  }
`;

мутация на внешнем интерфейсе

import gql from 'graphql-tag';

const REGISTER_USER = gql`
  mutation RegisterUser($registerInput: RegisterInput) {
    registerUser(registerInput: $registerInput) {
      message
    }
  }
`;

export { REGISTER_USER };

мутация на внутреннем интерфейсе

Mutation: {
    registerUser(_, { registerInput }) {
      const { username, password } = registerInput;
      const saltRounds = 12;

      console.log(123);

      if (!username || !password) {
        throw new Error('Username and password are required!');
      }
      if (password.length < 6) {
        throw new Error('Password must be minimum 6 characters!');
      }

      UserModel.findOne({ username }, (error: string, existingUser: User) => {
        if (error) {
          throw new Error(error);
        }
        if (existingUser) {
          throw new Error('That username is already in use!');
        } else if (!error && !existingUser) {
          bcrypt.genSalt(saltRounds, (error: string, salt: string) => {
            if (error) {
              throw new Error(error);
            }
            bcrypt.hash(password, salt, (error: string, hash: string) => {
              if (error) {
                throw new Error(error);
              } else {
                const newUser = new UserModel({
                  username,
                  password: hash,
                });

                newUser.save((error: string, user: User) => {
                  if (error) {
                    throw new Error(error);
                  } else {
                    return {
                      message: 'Registered successfully',
                    };
                  }
                });
              }
            });
          });
        }
      });
    },

1 Ответ

0 голосов
/ 20 апреля 2020

Я закончил тем, что добавил:

type SuccessRespose {
    message: String!
  }

type Mutation {
    registerUser(registerInput: RegisterInput): SuccessRespose!
  }

в резольверах

const user = await UserModel.findOne(
        { username },
        (error: string, existingUser: User): void => {
          if (error) {
            throw new Error(error);
          }
          if (!error && !existingUser) {
            bcrypt.genSalt(saltRounds, (error: string, salt: string) => {
              if (error) {
                throw new Error(error);
              }
              bcrypt.hash(password, salt, (error: string, hash: string) => {
                if (error) {
                  throw new Error(error);
                } else {
                  const newUser = new UserModel({
                    username,
                    password: hash,
                  });

                  newUser.save((error: string, user: User) => {
                    if (error) {
                      throw new Error(error);
                    } else {
                    }
                  });
                }
              });
            });
          }
        },
      );

      if (user) {
        throw new Error('That username is already in use!');
      } else {
        return {
          message: 'Registration successful!',
        };
      }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...