请求 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 });
}
};
createRefreshToken
和 createAccessToken
是传递用户数据以获取 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。
我已经囤积了很长时间了。每当我通过此代码时
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
这是发现错误的实际代码
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 });
}
};
createRefreshToken
和 createAccessToken
是传递用户数据以获取 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。