express icon indicating copy to clipboard operation
express copied to clipboard

rest api version best practice?

Open lifeike opened this issue 1 year ago • 1 comments

Hi Express,

when I want to manage multiple restufl api versions in one codebase. I faced a problem. I don't copy v1 version fold to v2 then change v2 folder source code,. In this case, it would create so much duplicated source code. Is there a way that we can identify controller/service modules to be use in specific api versions? for example, some controller we could use both for v1 and v2, some of controllers , we only use it in v2. Just like "versioning" middleware in aspnet core. thx~

https://www.infoworld.com/article/3562355/how-to-use-api-versioning-in-aspnet-core.html

lifeike avatar Apr 27 '23 20:04 lifeike

@lifeike
I mean, you can pretty much do something like this with routers...

//Create separate routers for each API version.
// routes/v1.js
const express = require('express');
const router = express.Router();

const sharedController = require('../controllers/sharedController');
const v1Controller = require('../controllers/v1Controller');

router.use('/shared', sharedController);
router.use('/specific', v1Controller);

module.exports = router;

// routes/v2.js
const express = require('express');
const router = express.Router();

const sharedController = require('../controllers/sharedController');
const v2Controller = require('../controllers/v2Controller');

router.use('/shared', sharedController);
router.use('/specific', v2Controller);

module.exports = router;

//Create controller modules for shared and version-specific logic.
// controllers/sharedController.js
const express = require('express');
const router = express.Router();

router.get('/', (req, res) => {
    res.send('This is a shared controller used in both v1 and v2.');
});

module.exports = router;

// controllers/v1Controller.js
const express = require('express');
const router = express.Router();

router.get('/', (req, res) => {
    res.send('This is a v1-specific controller.');
});

module.exports = router;

// controllers/v2Controller.js
const express = require('express');
const router = express.Router();

router.get('/', (req, res) => {
    res.send('This is a v2-specific controller.');
});

module.exports = router;
//In your main application file, import the routers for each API version and prefix the routes.

// app.js
const express = require('express');
const app = express();

const v1Routes = require('./routes/v1');
const v2Routes = require('./routes/v2');

app.use('/api/v1', v1Routes);
app.use('/api/v2', v2Routes);

const PORT = process.env.PORT || 3000;

app.listen(PORT, () => {
    console.log(`Server is running on port ${PORT}`);
});

But if someone wants to assign this to me, I'll look into it!!!

noraa-july-stoke avatar May 02 '23 01:05 noraa-july-stoke