路由架构的最佳实践

Best Practice for Route Architecture

我正在尝试为我的后端设置路由。我尝试过两种设置这些路由的方法,我想知道哪种方法适合最佳实践(或者两者都不适合?)。差异很小,但我很想知道这里是否有 objective“最佳”。

这是我的尝试:

const express = require("express");
const router = express.Router();
const flashcardController = require('../controllers/flashcardController');

router.get('/', flashcardController.readFlashcard);
router.post('/', flashcardController.createFlashcard);
router.patch('/', flashcardController.updateFlashcard);
router.delete('/', flashcardController.deleteFlashcard);

module.exports = router

VS

const express = require("express");
const router = express.Router();
const flashcardController = require('../controllers/flashcardController');


module.exports = (app) => {
    router.get('/api/flashcard', flashcardController.readFlashcard);
    router.post('/api/flashcard', flashcardController.createFlashcard);
    router.patch('/api/flashcard', flashcardController.updateFlashcard);
    router.delete('/api/flashcard', flashcardController.deleteFlashcard);

    app.use('/', router);
};

当然,我的 app.js(我的后端的入口点)文件需要针对每个选项进行稍微不同的编码。

如果您认为路由器的工作只是处理它接收到的一些请求,而调用代码的工作是将路由器放置在调用代码希望它运行的任何路径上,那么仅你的第一个选择会这样做。这将允许调用者在任何它想要的路径中使用这些路由。

如果您希望实现路由的模块完全 self-sufficient 并将路由安装在它希望它们所在的路径上,那么只有第二个选项可以做到这一点。

我会说“通常”和更“灵活”的方案是调用者将路由放在它想要的路径上的第一个方案。但是,你可以自由选择你想要的风格。

第二个选项的实施效率不高,因此可以改进。根本不需要路由器,因为路由可以直接直接安装在 app 对象上。并且,可以避免重复 /api/flashcard 多次。

例如,第二个选项可以是这样的:

const controller = require('../controllers/flashcardController');
const routePath = '/api/flashcard';

module.exports = (app) => {
    app.get(routePath, controller.readFlashcard);
    app.post(routePath, controller.createFlashcard);
    app.patch(routePath, controller.updateFlashcard);
    app.delete(routePath, controller.deleteFlashcard);
};

或者,即使只是这样:

const controller = require('../controllers/flashcardController');

module.exports = (app) => {
    app.route('/api/flashcard')
        .get(controller.readFlashcard)
        .post(controller.createFlashcard)
        .patch(controller.updateFlashcard)
        .delete(controller.deleteFlashcard);
};

而且,第一个可以简化为:

const router = require("express").Router();
const controller = require('../controllers/flashcardController');

router.route('/')
  .get(controller.readFlashcard)
  .post(controller.createFlashcard)
  .patch(controller.updateFlashcard)
  .delete(controller.deleteFlashcard);

module.exports = router