Nepoxx
Nepoxx

Reputation: 5348

Express 4 route setup

I'm trying to correctly and cleanly setup my Express routes, this is my routes.js file:

var tokenCtrl = require('./routes/token');
var expressJwt = require('express-jwt');
var config = require('./config');

module.exports = function (app) {  
    app.route('/api/token')
        .all(expressJwt({
            secret: config.jwtPrivateKey,
            userProperty: 'auth' //JWT payload will be bound to this value (req.{value})
        }))
        .post('validate', tokenCtrl.validate)
        .get('generate', tokenCtrl.generate);
}

Unfortunately, I can't specify the route suffix in the .post or .get (like above). So I'm stuck doing something like this:

var tokenCtrl = require('./routes/token');
var expressJwt = require('express-jwt');
var config = require('./config');

module.exports = function (app) {    
    app.route('/api/token/validate')
        .all(expressJwt({
            secret: config.jwtPrivateKey,
            userProperty: 'auth'
        }))
        .post(tokenCtrl.validate);

    app.route('/api/token/generate')
        .all(expressJwt({
            secret: config.jwtPrivateKey,
            userProperty: 'auth'
        }))
        .get(tokenCtrl.generate);
}

Now this is quite cumbersome. Is there a way to say that ALL my routes will have the /api prefix, and then add another prefix per controller? Is there a better way?

Upvotes: 1

Views: 949

Answers (2)

A.B
A.B

Reputation: 20445

what you can do is, make a common middleware function for ExpressJwt, that will automatically be passed to all routes. and in Your Routes file only make end points for '/token/validate' and '/token/generate' routes with Express Router

var express = require('express');
var tokenCtrl = require('./routes/token');
var expressJwt = require('express-jwt');
var config = require('./config');
var router = express.Router();

// make middleware for expressJwt
router.use(expressJwt({
    secret: config.jwtPrivateKey,
    userProperty: 'auth'
  }));
// define the token validate route 
router.post('/token/validate',tokenCtrl.validate );

// define the token generate route
router.get('/token/generate', tokenCtrl.generate)

module.exports = router;

Then, load this router module in the app, Now prefix '/api' will automatically included in further 'token/validate' and 'token/generate' endpoints

var tokenroutes= require('./routesjs');
app.use('/api', tokenroutes);

Alternatively if you dont want to include expressJwt in some of routes you can do this

Like expressJwt middle ware only be passed to vaildate route

var express = require('express');
var tokenCtrl = require('./routes/token');
var expressJwt = require('express-jwt');
var config = require('./config');
var router = express.Router();

// make middleware for expressJwt
ej = expressJwt({
    secret: config.jwtPrivateKey,
    userProperty: 'auth'
  });
// define the token validate route ,
router.post('/token/validate',ej,tokenCtrl.validate );

// define the token generate route
router.get('/token/generate', tokenCtrl.generate)

module.exports = router;

Upvotes: 2

Jordonias
Jordonias

Reputation: 5848

You can use a seperate router for your api with express.Router();

var express = require('express');
var tokenCtrl = require('./routes/token');
var expressJwt = require('express-jwt');
var config = require('./config');

var router = express.Router();

router.route('/token/validate')
  .all(expressJwt({
    secret: config.jwtPrivateKey,
    userProperty: 'auth'
  }))
  .post(tokenCtrl.validate);

router.route('/token/generate')
  .all(expressJwt({
    secret: config.jwtPrivateKey,
    userProperty: 'auth'
  }))
  .get(tokenCtrl.generate);

module.exports = router;

Then in your app.js you can do.

var express = require('express');
var apiRouter = require('./api');

app.use('/api', apiRouter);

Then you can do the same /token, or /validate and /generate

Upvotes: 2

Related Questions