我正在嘗試對 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 });
}
});
uj5u.com熱心網友回復:
您錯誤地注冊了中間件。
你有
router.get("/", authenticateToken(), async ...
雖然應該是
router.get("/", authenticateToken, async ...
您的第一個不正確版本嘗試立即呼叫該方法。相反,應該將方法參考傳遞給路由器,以便它是呼叫您的管道。
uj5u.com熱心網友回復:
我認為你應該像這樣定義你的中間件:
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 });
}
});
uj5u.com熱心網友回復:
我想到了!可悲的是,它與我上面的代碼和問題無關。
我錯過module.exports = router;
了檔案底部的那一行
!
感謝大家!
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/391362.html
上一篇:執行nodeJS檔案的存盤程序
