中间件无法授权
Middleware unable to authorize
我正在学习这个关于 MERN 堆栈的 Udemy 课程,但在使用网络令牌和授权时遇到了问题。
我创建了一个 auth.js 文件,如下所示:
const jwt = require("jsonwebtoken");
function auth(req, res, next) {
try {
const token = req.cookie.token;
if(!token){
res.status(401).json({errorMessage: "Unauthorized 1"});
}
const validatedUser = jwt.verify(token, process.env.JWT_SECRET);
req.user = validatedUser.id;
next();
}
catch(err) {
res.status(401).json({errorMessage: "Unauthorized 2"});
}
}
module.exports = auth;
在我的 snippetRouter.js 文件中,我引入了身份验证并尝试在我的 get 路由器中使用它。如下:
const router = require("express").Router();
const { get } = require("mongoose");
const Snippet = require("../models/snippetModel");
const auth = require("../middleware/auth");
router.get("/", auth, async(req, res) => {
try{
console.log(req.user); // <-- stuck here
const snippets = await Snippet.find();
res.json(snippets);
}
catch(err){
res.status(500).send();
}
});
使用 Insomnia,我正在调用 .get 路由器。我应该能够在终端控制台中看到用户 ID,但 Insomnia 给我“未经授权 2”错误。
这告诉我在 auth.js 上的 auth 函数的 try 块中发生了一些事情,但我不确定如何弄清楚。我完全按照说明学习教程。
我做错了什么,我该如何解决?
这行代码:
const token = req.cookie.token;
应该是:
const token = req.cookies.token;
因为 req.cookie
不存在,你对 req.cookie.token
的引用被抛出,因此你到达了 catch
块。
对未来的两点忠告。首先,当您在服务器上遇到错误时,请始终记录该错误是什么。
如果你有这个:
catch(err){
console.log(err);
res.status(500).send();
}
错误的原因可能很明显,因为 err
会告诉您问题所在。
其次,当您遇到这样的问题困扰您时,添加额外的日志记录以查看所有中间值是什么(或设置断点并在调试器中单步执行)。您可能很快就会发现您从未超过 const token = req.cookie.token;
然后您可以登录 req.cookie
看看为什么。那也会告诉你问题出在哪里。
我想不言而喻,这里之前的一些步骤需要将令牌设置到适当的 Insomnia cookie 罐中,以便令牌将出现在 cookie 中。
我正在学习这个关于 MERN 堆栈的 Udemy 课程,但在使用网络令牌和授权时遇到了问题。
我创建了一个 auth.js 文件,如下所示:
const jwt = require("jsonwebtoken");
function auth(req, res, next) {
try {
const token = req.cookie.token;
if(!token){
res.status(401).json({errorMessage: "Unauthorized 1"});
}
const validatedUser = jwt.verify(token, process.env.JWT_SECRET);
req.user = validatedUser.id;
next();
}
catch(err) {
res.status(401).json({errorMessage: "Unauthorized 2"});
}
}
module.exports = auth;
在我的 snippetRouter.js 文件中,我引入了身份验证并尝试在我的 get 路由器中使用它。如下:
const router = require("express").Router();
const { get } = require("mongoose");
const Snippet = require("../models/snippetModel");
const auth = require("../middleware/auth");
router.get("/", auth, async(req, res) => {
try{
console.log(req.user); // <-- stuck here
const snippets = await Snippet.find();
res.json(snippets);
}
catch(err){
res.status(500).send();
}
});
使用 Insomnia,我正在调用 .get 路由器。我应该能够在终端控制台中看到用户 ID,但 Insomnia 给我“未经授权 2”错误。
这告诉我在 auth.js 上的 auth 函数的 try 块中发生了一些事情,但我不确定如何弄清楚。我完全按照说明学习教程。
我做错了什么,我该如何解决?
这行代码:
const token = req.cookie.token;
应该是:
const token = req.cookies.token;
因为 req.cookie
不存在,你对 req.cookie.token
的引用被抛出,因此你到达了 catch
块。
对未来的两点忠告。首先,当您在服务器上遇到错误时,请始终记录该错误是什么。
如果你有这个:
catch(err){
console.log(err);
res.status(500).send();
}
错误的原因可能很明显,因为 err
会告诉您问题所在。
其次,当您遇到这样的问题困扰您时,添加额外的日志记录以查看所有中间值是什么(或设置断点并在调试器中单步执行)。您可能很快就会发现您从未超过 const token = req.cookie.token;
然后您可以登录 req.cookie
看看为什么。那也会告诉你问题出在哪里。
我想不言而喻,这里之前的一些步骤需要将令牌设置到适当的 Insomnia cookie 罐中,以便令牌将出现在 cookie 中。