请求 Cookie Returns 未定义

Request Cookies Returns Undefined

我已经囤积了很长时间了。每当我通过此代码时

app.get("/", function (req, res) {
  const rf_token = "Hello Express Cookies";
  res.cookie("refreshtoken", rf_token, {
    httpOnly: true,
      path: "/api/users/refresh_token",
      maxAge: 7 * 24,
  });

  console.log("refresh_token: ", req.cookies.refreshtoken);
});

可悲的是,这就是它 returns

refresh_token:  undefined

我通读了此处提供的一些解决方案,但似乎 运行 不适合我

app.use(cors());
app.use(morgan("dev"));
app.use(express.json());
app.use(cookieParser());
app.use("/api/users", userRouter);

我在路由之前初始化了 cookie-parser。

我使用 npm install cookie-parser --save

安装了 cookie 解析器

这是发现错误的实际代码

exports.login = async (req, res) => {
  try {
    const { email, password } = req.body;
    const user = await User.findOne({ email });
    if (!user)
      return res.status(400).json({ message: "This email does not exist." });

    const isMatch = await bcrypt.compare(password, user.password);
    if (!isMatch)
      return res.status(400).json({ message: "Password do not match." });

    const getRefreshToken = createRefreshToken({ id: user._id });

    res.cookie("getrefreshtoken", getRefreshToken, {
      httpOnly: true,
      path: "/api/users/refresh_token",
      maxAge: 7 * 24,
    });

    res.json({ message: "You have successfully logged in!" });
  } catch (error) {
    return res.status(500).json({ message: error.message });
  }
};

这是我尝试请求令牌的地方

exports.theToken = async (req, res) => {
  try {
    const refresh_token = req.cookies.getrefreshtoken;

    console.log(refresh_token);

    if (!refresh_token)
      return res.status(400).json({ message: "Please login now!" });

    jwt.verify(refresh_token, process.env.REFRESH_TOKEN_SECRET, (error, user) => {
      if (error) return res.status(400).json({ message: "Please login now!" });

      const access_token = createAccessToken({ id: user.id });
      res.json({ access_token });
    });
  } catch (error) {
    return res.status(500).json({ message: error.message });
  }
};

createRefreshTokencreateAccessToken 是传递用户数据以获取 JSON 网络令牌的函数。

在客户端,它 returns 400 错误只是为了发现在服务器没有任何东西被发送到客户端,因为它 returns 未定义

你在这里比较苹果和橘子。

调用 res.cookie() 在响应中设置 Set-Cookie header ,当您发送响应时,它将与您的响应一起发回,然后客户端负责保存新设置饼干。

检查 res.cookies 查看来自请求 header 的已经解析的传入 cookie,这些 cookie 已经到达并且已经解析。因此,您在 res.cookie() 中所做的不会显示在相同请求的 res.cookies 中。您可以检查传出的 header 并看到 res.cookie() 在那里放了一个新的 Set-Cookie header。

您应该会在该客户端的下一个传入请求中看到您的值显示在 res.cookies 中(假设该客户端支持 cookie)。


仅供参考,您为 / 路由显示的代码永远不会发送任何响应,因此您设置的 cookie 也永远不会真正发送出去。您需要 res.send(...)res.json(...) 或类似的东西来实际发送您配置的 cookie 可以使用的响应。

此外,由于您似乎在该 cookie 上设置了显式路径,因此浏览器也只会发送带有对该特定路径的请求的 cookie。