请求cookie返回未定义



我在这方面已经有相当长的一段时间了。每当我传入这段代码

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);
});

遗憾的是,这就是它返回的

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解析器这是发现bug的实际代码

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 web令牌的函数。

在客户端,它返回400 error,结果发现服务器没有向客户端发送任何东西,因为它返回undefined

你这是在拿苹果和橘子作比较。

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

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

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


供参考,你为/路由显示的代码从未发送任何响应,所以你设置的cookie也从未实际发送出去。您需要res.send(...)res.json(...)或类似的东西来实际发送您配置的cookie可以使用的响应。

而且,因为看起来你在cookie上设置了一个显式的路径,浏览器只会将该cookie与请求一起发送到该特定路径。

最新更新