我正在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上使用send和post请求时,它一直抛出错误:
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
我很好奇为什么这里的重定向不起作用?
问题是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响应返回/otherPage的HTML内容或数据。此外,重定向通常具有3XX状态码,并且重定向具有200状态码,这是误导性的,并且肯定不是最佳实践。
最好发送JSON响应和数据,并添加一个redirectPath,然后你可以在客户端处理。
res
.status(200)
.json({ user: { name: user.name }, token, redirectPath: `api/v1/user/${user.name}/dashboard` })