NodeJS / ExpressJS 在路由前检查有效的令牌参数

NodeJS / ExpressJS check valid token parameter before routing

我有以下应用程序代码:

(app.js)

var express = require('express')
  , app = express()
  , port = process.env.PORT || 8082

app.use(require('./controllers'))

app.use(function(req, res, next) {
  res.send('Test')
  next()
})

app.listen(port, function() {
  console.log('Listening on port ' + port)
})

和两个控制器:

(index.js)

var express = require('express')
  , router = express.Router()

router.use('/projects', require('./projects'))

module.exports = router

(projects.js)

var express = require('express')
  , router = express.Router()

router.get('/:id', function(req, res, next) {
  res.json({project: req.params.id})
})

module.exports = router

这有效,但现在我必须检查我的 url 是否有有效令牌。 我的 url 看起来像 http://server/api/projects?token=abc or http://server/api/projects/:id?token=abc 如果令牌无效,则不应加载/显示任何项目(或其他控制器)。 处理此问题的最佳方法是什么以及在哪里(在 app.js 或 controllers/index.js 中)?

使用中间件。

app.use(function (req, res, next) {
    if (checkToken(req.query.token) {
        return next();
    }

    res.status(403).end("invalid token");
});
app.use(require('./controllers'))

您可以在 route 函数中执行此验证,或者您可以使用 middleware 验证 param 然后执行一些逻辑。

var express = require('express')
   , router = express.Router()

function validate(req,res,next) {
  if(req.params.id) // some logic
  else other stuff

  next();
}

router.get('/:id', validate, function(req, res, next) {
  res.json({project: req.params.id})
})

module.exports = router