簡體   English   中英

express.Router() 與 app.get

[英]express.Router() vs. app.get

我正在為 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())實例 - 這個路由器實例如何與其他路由器實例交互? 從表面上看沒有什么意義。

正如 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 框架目錄結構並進行模塊導出。

我實際上認為這實際上是首選方式。 您單獨定義您的路線,只需在您的應用程序中使用它。 它提供了很好的關注點分離。 它還使測試您的路線變得非常容易。 是的,您可以使用 express.Router 創建一個可靠的 RESTful 后端。 此外,它還附加了所有基本的 HTTP 動詞,如 get、post、put、delete、patch 等。

Express().getExpress.Router().get的作用相同。 不同之處在於路由器是更好的實踐,因為它允許我們將 api 端點作為中間件進行管理。

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

Express 和 JS 框架的問題在於,文檔沒有解釋為什么從使用 Express 主“應用程序”對象轉變。 我的猜測是,我們應該將關注點與路由邏輯與主要應用程序管理本身(即配置、模板、數據庫連接等)分開。

很好的問題,但沒有人應該問這個問題。

事實上,express 是一個優秀的框架。 但是我看到了很多關於路由處理的問題,我們都浪費了時間。 而且即使正確完成,也只是一堆代碼,實際上浪費了人們編寫它的時間,甚至更多的是在糾正愚蠢的錯誤上。

嘗試路線魔法

您只想執行 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'))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM