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

时间:2018-10-26 14:18:39

标签: javascript node.js express

作为学习NodeJS的一种练习,我正在使用ExpressJS构建一种可响应Web请求的API。截至目前,该程序中包含三个路由,即“ / 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
        })
    } 
}

我的问题是,如何将这种中间件仅应用于需要身份验证的路由? 我想过只是创建另一个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怪癖让我感到困惑。

3 个答案:

答案 0 :(得分:3)

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

我将创建应为其应用中间件的基本路由,例如

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

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

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

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

您的middlware函数将在/ private中的任何路由上被调用,而不会到达您的控制器。

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

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

答案 1 :(得分:2)

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

因此,如果您有某些路由,而您不希望进行身份验证,则只需将其中间件保持在其他中间件之上即可。

handleAppleEvent:withReplyEvent:

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

希望这会有所帮助!

答案 2 :(得分:0)

express-unless npm软件包可用于此要求。

这允许中间件功能在“除非”满足特定条件的情况下在路径上运行,在这种情况下,它将被跳过。可以设置许多不同类型的条件,methodpathextcustom

要从身份验证中间件中排除某些路径,请使用路径条件。

app.use(requiresAuth.unless({
  path: [
    '/index.html',
    { url: '/', methods: ['GET', 'PUT']  }
  ]
}))