Skip to content

rest api version best practice? #5175

Description

@Feeco-Li

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

Activity

  1. noraa-july-stoke commented on May 2, 2023

    @noraa-july-stoke

    @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!!!

  2. converted this issue into a discussion #5893 on Sep 2, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions