仅在某些路由上使用 Express.JS 中间件

10 javascript node.js express

作为学习 NodeJS 的练习,我正在使用 ExpressJS 构建一种响应 Web 请求的 API。截至目前,程序中有 3 条路径,“/login”、“/register”和“/changePassword”。所有这些方法都不需要处理任何类型的令牌。

但是,我计划添加到程序中的所有其他路由(例如,'/post' 路由)将要求用户使用从 POST 请求获得的令牌对自己进行身份验证,该令牌使用正确的凭据发送到 '/login'。

为了验证令牌,我编写了一个中间件函数:

module.exports.validateToken = function (req,res,next) {
    const token = req.headers['x-access-token']
    console.log(`validateToken() - TOKEN: ${token}`)
    if (token) {
        //Make sure the token is valid[...]
        next()
    }else {
        return res.status(401).send({
            message: 'Missing token',
            success: false
        })
    } 
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,如何将此中间件仅应用于需要身份验证的路由?我想过创建另一个 Router 对象,并像这样调用它:

const tokenValidator = require('./util').validate.validateToken
// Router used for any actions that require user-authentication
const authRouter = new app.Router()
authRouter.use(tokenValidator)
Run Code Online (Sandbox Code Playgroud)

但这会干扰我原来的、无需身份验证的路由吗?

// Initiate the routes that don't need auth
const routes = require('./routes')(app)
Run Code Online (Sandbox Code Playgroud)

在此先感谢,我更像是一名 Java 开发人员,所以很多 Javascript 怪癖让我难住了。

Lee*_*ley 16

假设您的中间件在“./middleware/auth”中

我会创建一个应该应用中间件的基本路由,例如

app.use("/private", require("./middleware/auth"));
Run Code Online (Sandbox Code Playgroud)

这将在任何以“/private”开头的路由上调用您的身份验证中间件

因此,任何需要身份验证的 API 控制器都应定义为:

app.use("/private/foo", require("./controllers/foo"));
Run Code Online (Sandbox Code Playgroud)

您的中间件函数将在 /private 中的任何路由到达您的控制器之前被调用。

任何不需要您的中间件的,都应该简单地留在“私有”api上下文之外,例如

app.use("/", require("./controllers/somecontroller"));
Run Code Online (Sandbox Code Playgroud)


小智 7

在 Expressjs 中,您添加的每个中间件都会添加到中间件堆栈中,即 FIFO。

因此,如果您有某些路由,并且不希望对其进行身份验证,则只需将其中间件置于其他中间件之上即可。

app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use(<<pattern>>, authenticate)
Run Code Online (Sandbox Code Playgroud)

此外,您可以尝试使用nodejs basic-auth模块进行身份验证

希望这可以帮助!