Я создаю приложение онлайн-сообщества в nodejs/expressjs. У меня возникла проблема с перенаправлением на правильную страницу после того, как пользователь вошел в систему. Я нашел несколько статей, которые тесно связаны, но все мои попытки исправить ошибки из этих статей не помогают.
/*-----------Login and register using email and password------------------- */
const register = async (req, res) => {
const user = await User.create({...req.body });
try{
const token = user.createJWT();
res.status(StatusCodes.CREATED).json({ user: { name: user.name}, token });
const { name } = user;
res.redirect(`api/v1/user/${user.name}/dashboard`)
} catch (error) {
res.status(500).json({
success: false,
error: error.message,
});
}
};
const login = async (req, res) => {
const { email, password } = req.body;
if (!email || !password) {
throw new BadRequestError("Please provide an email and password");
}
try {
const user = await User.findOne({ email }).select("+password");
if (!user) {
return res.status(StatusCodes.UNAUTHORIZED).json(" Invalid credentials ");
}
const isMatch = await user.matchPassword(password);
if (!isMatch) {
throw new UnauthenticatedError("Invalid credentials");
}
const token = user.createJWT();
res.status(StatusCodes.OK).json({ user: {name: user.name}, token});
const { name } = user;
res.redirect(`api/v1/user/${name}/dashboard`)
} catch (error) {
res.status(500).json({
success: false,
error: error.message,
});
}
};
/*-----------Login and register using email and password------------------- */
при использовании отправки и отправки запроса на /auth/login или /auth/register он продолжает выдавать ошибку:
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
Мне любопытно, почему этот редирект здесь не работает?
Вы отправляете ОК, что означает 200, затем перенаправляете, что обычно 302. Каковы ваши ожидания в любом случае?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Проблема в том, что json() и redirect() оба отправляют ответ. И
в то время как вы можете технически добиться того, что ищете, установив заголовки и тело ответа вручную, а затем отправив его:
.get('/test', (req, res) => {
const jsonData = JSON.stringify({ data: 41 })
res.statusCode = 200
res.setHeader('Location', '/otherPage');
res.setHeader('Content-Type', 'application/json');
res.setHeader('Content-Length', Buffer.byteLength(jsonData));
res.write(jsonData);
res.end()
})
Перенаправление, вероятно, заставит ответ HTTP вернуть HTML-содержимое или данные /otherPage. Кроме того, перенаправление обычно имеет код состояния 3XX и делает перенаправление со статусом 200, что вводит в заблуждение и определенно не является лучшей практикой.
Лучше отправить ответ JSON с данными и добавить redirectPath, который затем можно обработать в клиенте.
res
.status(200)
.json({ user: { name: user.name }, token, redirectPath: `api/v1/user/${user.name}/dashboard` })
Это не работает, так как вы уже установили заголовки и отправили объект JSON с помощью метода
.json(). В принципе, вы не можете отправить объект и перенаправить страницу одновременно. Вы можете сохранить свой токен в каком-либо хранилище, а затем отправить его с помощью метода перенаправления, если это необходимо.