【问题标题】:express.Router() vs. app.getexpress.Router() 与 app.get
【发布时间】:2015-09-15 09:11:12
【问题描述】:

我正在为 Node.js 使用 Express 4 服务器

Express 内置了一个路由器,如下所示:

在 app.js 中

    var router = express.Router();
    app.use(router);
    app.use('/users', usersRoutes);

在 userRoutes.js 中:

var router = express.Router();

router.get('/', function (req, res, next) {

}

router.get('/:user_id', function (req, res, next) {

}

router.post('/:user_id', function (req, res, next) {

}

router.put('/:user_id', function (req, res, next) {

}

router.delete('/:user_id', function (req, res, next) {

}

module.exports = router;

但我发现很难在线找到此类路由器的任何可靠文档。对于使用 app.get、app.post、app.put、app.delete 等的旧样式,有更多文档。更令人困惑的事情之一是第一个参数(路由路径)似乎要求作为程序员,我们从 router.get/post/put/delete 方法中剥离 app.use 参数。

例如:

app.use('/users', usersRoutes);

...这意味着 usersRoutes 中的所有路由在路径的开头已经有一个不可见的'/users' - 我不确定我是否喜欢。 这意味着在 usersRoutes.js 中:

 var router = express.Router();

 router.get('/users/:user_id', function (req, res, next) {  //WRONG!!

    }

 router.get('/:user_id', function (req, res, next) {  //RIGHT

    }

这有点令人困惑,但也许我可以通过更长的路径来欣赏。

鉴于此 express.Router 缺乏文档 - 我认为这不是首选方式 - 但是否可以使用 express.Router 创建可靠的 RESTful 后端 - 并且它是否附加了所有基本 HTTP 动词?

另一个令人困惑的事情是----> 在 app.js 中我们有一个路由器实例app.use(express.Router()) - 这个路由器实例如何与其他实例交互?从表面上看没有什么意义。

【问题讨论】:

  • Express API 文档链接:expressjs.com/api.html
  • 谢谢,但这并不具有建设性。例如,express.Router 的一个问题是 app.params 似乎无法使用它。而且我所知道的并不是真正的 express.params 或 router.params。
  • 根据这个scotch.io/tutorials/learn-to-use-the-new-router-in-expressjs-4 有一个 router.params 功能,但总而言之,如何在 Express 应用程序中多次甚至一次使用 express.Router() 还不是很清楚

标签: javascript node.js express


【解决方案1】:

我实际上认为这实际上是首选方式。您单独定义您的路线,并在您的应用程序中简单地使用它。它提供了很好的关注点分离。它还使测试您的路线变得非常容易。是的,您可以使用 express.Router 创建可靠的 RESTful 后端。此外,它还附加了所有基本的 HTTP 动词,例如 get、post、put、delete、patch 等。

【讨论】:

    【解决方案2】:

    正如 Bidhan A 的回答所述,这是使用 Express 执行此操作的首选方式,并且自 Express 4 以来看起来就是这样。

    您可以完全调整您的代码和逻辑。

    例如,您可以拥有一个带有此代码的routes/APIRouter.js 文件:

    var apiRouter = express.Router();
    
    apiRouter.get('/reports', controllers.getReports);
    apiRouter.get('/reports/:id', controllers.getReport);
    apiRouter.post('/reports', controllers.createReport);
    apiRouter.put('/reports/:id', controllers.updateReport);
    apiRouter.delete('/reports/:id', controllers.deleteReport);
    

    您还可以拥有/controllers/reportsController.js,最后在您的主文件app.js 或命名为server.js 获取:

    var express = require('express');
    var app = new express();
    var apiRouter = require('./routes/APIRouter');
    app.use('/api',apiRouter);
    

    所以,回答你的问题:

    1. 是的,这是首选方式,而且是官方的方式。
    2. 是的,您可以使用 Router 控制整个 HTTP,您应该使用其他基于 express 的模块,例如:body-parsererror-handlercookie-parser,以便完成该控制 .

    注意:这假设您已经知道首选的通用 Web 框架目录结构并进行模块导出。

    【讨论】:

      【解决方案3】:

      Express().get 的作用与Express.Router().get 相同。不同之处在于 router 是更好的实践,因为它允许我们将 api 端点作为中间件进行管理。

      https://expressjs.com/en/api.html#router

      类似的 Express 和 JS 框架的问题在于文档没有解释为什么从使用 Express 主“应用程序”对象的转变。我的猜测是,我们应该将关注点与主应用程序管理本身的路由逻辑分开(即配置、模板、数据库连接等)

      【讨论】:

        【解决方案4】:

        很好的问题,但没有人应该问这个问题。

        事实是 express 是一个优秀的框架。但是我看到了很多关于路线处理的问题,以至于我们都浪费了时间。而且即使做得正确,它只是一堆代码,实际上浪费了人们编写它的时间,甚至更多地浪费在纠正愚蠢的错误上。

        试试Route Magic

        您只想编写 2 行代码并让模块读取您的目录和文件结构以处理所有 app.use 路由调用,如下所示:

        const magic = require('express-routemagic')
        magic.use(app, __dirname, '[your route directory]')
        

        原来如此!没有别的了。

        对于那些你想手动处理的,只是不要使用将目录传递给 Magic。

        告别

        app.use('/i/repeat/myself', require('./routes/i/repeat/myself'))
        app.use('/i/repeat/myself/again', require('./routes//i/repeat/myself/again'))
        app.use('/i/keep/repeating/myself', require('./routes/i/keep/repeating/myself'))
        

        【讨论】:

          猜你喜欢
          • 2015-04-03
          • 2014-06-29
          • 2015-12-11
          • 2013-03-04
          • 2022-09-29
          • 1970-01-01
          • 2015-01-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多