javascript 用户登录后如何在Nodejs/Expressjs中重定向?

dwbf0jvd  于 2023-04-10  发布在  Java
关注(0)|答案(1)|浏览(92)

我正在用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上使用sent和post请求时,它会不断抛出错误:

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

我很好奇为什么这个重定向在这里不会工作?

9udxz4iz

9udxz4iz1#

问题是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` })

相关问题