Я пытаюсь сделать регистрационную форму с помощью 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',
};
}
});
}
});
});
}
});
},