为什么我的"req"未定义? "TypeError: Cannot read property 'headers' of undefined"



我正在尝试在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;在文件的底部!

谢谢大家!

相关内容

  • 没有找到相关文章

最新更新