我正在尝试在Express Router中为我的路由实现身份验证中间件。
当路由器转到中间件并尝试读取req.headers["authorization"]
时,我得到错误:
const authHeader = req.headers["authorization"];
^
TypeError: Cannot read property 'headers' of undefined
我不确定我在这里遗漏了什么,我已经浏览了Express路由器中间件,但在那里找不到答案。
我也尝试过不像这样调用router.use(authenticateToken);
的router.use(authenticateToken());
,并得到了这个错误:TypeError: Router.use() requires a middleware function but got a Object
下面是中间件功能和我尝试使用它的路径。下面是GitHub上的项目的当前状态。
// Authenticate Token!
authenticateToken = function (req, res, next) {
const authHeader = req.headers["authorization"];
console.log(authHeader);
const token = authHeader && authHeader.split(" ")[1];
if (token == null) {
return res.sendStatus(401);
} else {
jwt.verify(token, process.env.ACCESS_TOKEN_SECRET, (err, username) => {
if (err) {
return res.sendStatus(403);
} else {
req.username = username;
next();
}
});
}
};
router.use(authenticateToken());
router.get("/", authenticateToken, async (req, res) => {
try {
const users = await User.find();
res.status(200).json(users);
} catch (err) {
res.status(500).json({ message: err.message });
}
});
您错误地注册了中间件。
你有
router.get("/", authenticateToken(), async ...
而它应该是
router.get("/", authenticateToken, async ...
您的第一个错误版本尝试立即调用该方法。相反,方法引用应该传递给路由器,这样它就是调用您的管道。
我认为您应该这样定义中间件:
router.get("/", authenticateToken, async (req, res) => {
try {
const users = await User.find();
res.status(200).json(users);
} catch (err) {
res.status(500).json({ message: err.message });
}
});
我想通了!遗憾的是,这与我上面的代码和问题无关。
我没接电话module.exports = router;
在文件的底部!
谢谢大家!