【问题标题】:Using Express.JS middleware on only some routes仅在某些路由上使用 Express.JS 中间件
【发布时间】:2019-03-31 07:59:01
【问题描述】:

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

但是,我计划添加到程序中的所有其他路由(例如,'/post' 路由)都需要用户使用从 POST 请求中获得的令牌验证自己,以使用正确的 '/login'证书。

为了验证Token,我写了一个中间件函数:

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
        })
    } 
}

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

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

但这会不会影响我原来的免验证路由?

// Initiate the routes that don't need auth
const routes = require('./routes')(app)

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

【问题讨论】:

    标签: javascript node.js express


    【解决方案1】:

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

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

    app.use("/private", require("./middleware/auth"));
    

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

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

    app.use("/private/foo", require("./controllers/foo"));
    

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

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

    app.use("/", require("./controllers/somecontroller"));
    

    【讨论】:

    • 这非常有效,我根本不需要创建第二个路由器。干杯!
    • 老兄没问题!
    【解决方案2】:

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

    因此,如果您有某些路由,您不想对其进行身份验证,您可以简单地将它们的中间件置于其他中间件之上。

    app.use('/', indexRouter);
    app.use('/users', usersRouter);
    app.use(<<pattern>>, authenticate)
    

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

    希望这会有所帮助!

    【讨论】:

    • 尽量保持原味!我对 nodejs/javascript 最大的抱怨之一是每个问题似乎都由另一个库解决了!这不是学习的方法
    • 是的。再说一次,玩,使用预先存在的库比重新发明轮子更容易:)。在生产服务器上,是的,使用本机确实很有意义!
    猜你喜欢
    • 2020-05-09
    • 2012-03-05
    • 2016-07-09
    • 2019-07-06
    • 1970-01-01
    • 2022-08-02
    • 2017-09-30
    • 1970-01-01
    • 2019-01-05
    相关资源
    最近更新 更多