ExpressJS中无法将中间件应用于路由器



我有一个应用程序,其中有公共路由和经过身份验证的路由isAuthenticated例如应用于新闻控制器。

globalRouter: function (app) {
app.use((req, res, next) => {
logger.log("Endpoint: ", req.originalUrl);
next();
});
const userRouter = require("./user/controller");
const globalRouter = require("./global/controller");
const newsRouter = require("./news/controller");
app.use("/user", userRouter);
app.use("/global", globalRouter);
app.use("/news", middleware.isAuthenticated(), newsRouter); // here
}

这是在middleware.js文件中编写的isAuthenticated代码。

const security = require("../utils/security");
const service = require("../user/service");
exports.isAuthenticated = function (req, res, next) {
let authorization = req.headers.authorization;
let token = null;
if (authorization.startsWith("Bearer ")) {
token = authorization.substring(7, authorization.length);
if (token !== null) {
service.checkUserTokenMiddleware(token, security).then((response) => {
console.log("checkUserTokenMiddleware", response);
if (response) {
next();
}
});
}
}
};

问题是,当我npm启动应用时,我在下面收到了这个错误

TypeError:无法读取Object.exports.isAuthenticated 中未定义的属性"headers">

这里缺少什么?

为什么我在另一个文件中使用相同的方法(如req.body.blablareq.headers.blabla(时会出现这样的错误?

任何帮助都将不胜感激。

谨致问候。

只需删除函数调用后的括号:

app.use("/news", middleware.isAuthenticated, newsRouter);

您不必在回调中调用app.use中的函数,Express会自己将req,res,next传递给auth函数并调用它。

这取决于如何导入middleware.js。由于您正在导出isAuthenticated作为函数。在传递到app.use之前,不应调用此函数。

其他需要注意的是,您永远不会在出现错误或其他情况时调用下一个函数。

请看下面的例子。

//中间件.js

const security = require("../utils/security");
const service = require("../user/service");
exports.isAuthenticated = function (req, res, next) {
let authorization = req.headers.authorization;
let token = null;
if (authorization.startsWith("Bearer ")) {
token = authorization.substring(7, authorization.length);
if (token !== null) {
service
.checkUserTokenMiddleware(token, security)
.then((response) => {
if (response) {
next();
}
})
.catch((error) => next(error));
} else {
next("UNAUTHORIZED");
}
} else {
next("UNAUTHORIZED");
}
};

//app.js

const middleware = require("./middleware")
app.use((req, res, next) => {
logger.log("Endpoint: ", req.originalUrl);
next();
});
const userRouter = require("./user/controller");
const globalRouter = require("./global/controller");
const newsRouter = require("./news/controller");
app.use("/user", userRouter);
app.use("/global", globalRouter);
app.use("/news", middleware.isAuthenticated, newsRouter); // here

最新更新