Как передать ответ на клиентс сервера?
Ниже предоставлю свой рабочий код,а именно метод login, который согласно моему заданию , разбит на трехслойную архитектуру. Mоя проблема , если candidate не найден ,то я выбрасываю ошибку. В консоли я этот ответ вижу , но на клиент ничего не приходит. Как мне вернуть эту ошибку на клиент? У меня есть "глупая" идея передать в метод поиска checkLogin обьект res. но мне кажется , есть нормальные способы решения этой проблемы.
async login(req: Request, res: Response) {
try {
const { email, password } = req.body;
const token = await loginService.checkLogin(email, password);
return res.status(200).json({ token });
} catch (e) {
console.error(e);
res.status(404).json(e);
}
}
а вот класс с методом checkLogin, в котором и происходит выброс ошибкии. как в нем вернуть ответ на клиент ?
class LoginService {
async checkLogin(email: string, password: string): Promise<string> {
const candidate = registrationService.checkUser(email);
if (!candidate) {
throw new Error("Пользователь с таким email не существует!");
}
const comparePassword = await bcrypt.compare(String(password), String(candidate.password));
if (!comparePassword) {
throw new Error("Указан неверный пароль");
}
const token = await jwtService.generateToken(candidate.id, candidate.name, candidate.lastName, candidate.email);
candidate.token = token;
return token;
}
}
Ответы (2 шт):
Откопал свой очень давний код, я делал примерно так:
private async validateUser(createUserInput: CreateUserInput) {
let userArgs: UsersArgs = new UsersArgs();
userArgs.login = createUserInput.login;
const user = await this.usersService.findUserByLogin(userArgs);
console.log(user);
if (!user)
throw new UnauthorizedException({ message: 'Пользователь не найден' });
const passwordEquals = await bcrypt.compare(createUserInput.password, user.password)
if (!passwordEquals)
throw new UnauthorizedException({ message: 'Неверный пароль' });
return user;
}
async login(createUserInput: CreateUserInput) {
const user = await this.validateUser(createUserInput);
return this.generateToken(user);
}
Предполагаю, что Вам просто нужно немного подредактировать выброс ошибки, Вы используете throw new Error("Указан неверный пароль");
, и Ваш клиент по всей видимости просто не понимает такой формат, попробуйте использовать такой подход: throw new UnauthorizedException({ message: 'Указан неверный пароль' });
, так Вы передаете на клиент json объект с ошибкой внутри, соответственно читаем примерно так: const errMsg = response.message
Ошибку ловлю так :
catch (error: any) {
console.error(error);
res.status(404).json(error.message);
}
,а создаю ошибку так :
if (candidate) {
throw new Error("Пост с таким названием уже существует!");
}
При такой логике на клиент приходит ошибка.