Reputation: 5348
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
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
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