Abid
Abid

Reputation: 31

Node Js : Multiple routes in single router file

Can we define multiple routes in single router file. e.g : Consider we have company and user tab and I want to define 1 routers file for each tab. All Company related calls should be handled by Company router and User related calls should be handled by User router.

//app.js
app.use('/', require('./routes/user'));
app.use('/api/user/load_user_list', require('./routes/user'));
app.use('/api/user/get_user_detail', require('./routes/user'));

//User.js router
var express = require('express');
var router = express.Router();

//router 1
router.get('/', function (req, res, next) {
    //do something here - 
});

//router 2
router.get('/api/user/load_user_list', function (req, res, next) {
    //do something here
});

//router 3
router.get('/api/user/get_user_detail', function (req, res, next) {
    //do something here
});
module.exports = router;

Currently, when app receives call for '/api/user/load_user_list' my "router 1" gets called.

Am I missing out something. To deal with this, I guess I can have single router call and delegate to different function based on request baseUrl.

Any help / suggestion will be appreciated.. Thanks

Upvotes: 0

Views: 5585

Answers (2)

Gowtham Raj J
Gowtham Raj J

Reputation: 967

What is happening here is, since you have given /api/user/load_user_list in app.use('/api/user/load_user_list', require('./routes/user'));, express will prefix all the routes inside your ./routes/user with /api/user/load_user_list.

The / router 1 in your user.js becomes /api/user/load_user_list + / and /api/user/load_user_list in your user.js becomes /api/user/load_user_list(from app.js) + /api/user/load_user_list.

So only when you hit /api/user/load_user_list/api/user/load_user_list, your router 2 will be called.

You can change your app.js code to

app.use('/api/user', require('./routes/user'));

and your routes/user.js to

//router 1
router.get('/', function (req, res, next) {
    //do something here - 
});

//router 2
router.get('/load_user_list', function (req, res, next) {
    //do something here
});

//router 3
router.get('/get_user_detail', function (req, res, next) {
    //do something here
});

Now, when you hit /api/user/load_user_list, it will match /api/user(app.js) + /load_user_list(routes/user.js) and the route which you wanted will be called.

Upvotes: 1

Bala Abhinav
Bala Abhinav

Reputation: 1348

Instead of :

app.use('/', require('./routes/user'));
app.use('/api/user/load_user_list', require('./routes/user'));
app.use('/api/user/get_user_detail', require('./routes/user'));

Just use :

app.use('/', require('./routes/user'))
app.use('/api/user', require('./routes/user'));

And in your router file rename the routes like so :

//router 2
router.get('/load_user_list', function (req, res, next) {
    //do something here
});

//router 3
router.get('/get_user_detail', function (req, res, next) {
    //do something here
});

Reason : When app.use('/api/user/xyz', require('./xyz')) is called, the uri path after api/user/xyz is sent to the router to be matched

Upvotes: 1

Related Questions