簡體   English   中英

Express js中的app.use()、app.get()、router.get()和router.use()有什么區別?

[英]What is the difference among app.use(), app.get () , router.get() and router.use() in Express js?

我仍然不知道這些端點之間的區別,最終它們都是路線但我不知道我應該何時何地使用它? 在什么場景下?

app.use('/user/:id', function (req, res, next) {
  console.log('Request Type:', req.method)
  next()
});
app.get('/user/:id', function (req, res, next) {
  res.send('USER')
});

router.get('/user/:id', function (req, res, next) {
  res.send('USER')
});

router.use('/user/:id', function (req, res, next) {
  res.send('USER')
});

我你們可以幫我解決這個問題。

.use()和.get()的區別是.use()會監聽任何類型的請求,而.get()只會監聽GET請求,如.post()。output()等。

對於路由器,您可以將其視為子路由。

例如,你可以做這樣的事情。

router.get('/:id', (req, res, next) => {res.send('user')})
router.post('/', (req, res, next) => {/* some create user logic */})

app.use('/user', router) // if you do this routers will match '/user/:id' and '/user' path

當然,你可以在同一個應用程序中擁有多個路由器。 所以你的代碼可以更有條理。

默認情況下, .use().get()有兩個主要區別。

  1. .get()只匹配GET請求, .use()將匹配任何類型的請求(POST,PUT,GET等......)
  2. 如果你提供了一個.use()的路徑,它的匹配就更自由了,如果路徑“開始”你傳遞給.use()的路徑,它將匹配。 它以這種方式完成,因此您可以設置一個中間件處理程序,該處理程序將觸發一組廣泛的URL,而不僅僅是一個URL。 .get()更常用於受限制的URL,例如一個特定的URL。

app.get()router.get()幾乎相同。 app對象是一個路由器,上面還有一些其他的屬性和方法。 因此,路由器對象中的大多數方法也在app對象上,但反之亦然。

您可能出於各種原因使用路由器而不是app對象:

  1. 代碼模塊化。 模塊創建自己的路由器,在其上設置一堆路由,然后導出單個路由器,然后調用者可以將其添加到當前應用程序。
  2. 你有一堆所有具有相同前綴的路由,並且發現它更清晰,可以為該公共前綴設置路由器,然后只需將路由放在該路由器上,而無需在每個路由中指定前綴。
  3. 要創建一組共享相同中間件處理的路由,但應用程序中的其他路由不共享該中間件處理。 在這種情況下,您創建路由器,在其上放置一些中間件,然后在該路由器上定義路由。 中間件僅針對路由到此路由器的路由觸發。

一些例子:

// matches /hello and /hello/hi and /hello/goodbye for GET, POST or PUT
app.use('/hello', ...);

// matches only a GET request for /hello
app.get('/hello', ...);

使用路由器來幫助實現模塊化的示例。

其中定義了一些路由的模塊:

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

router.use(someMiddlewareForWholeRouter);

router.get('/hello', ...);
router.get('/goodbye', ...);
router.get('/callme', ...);

module.exports = router;

在您的應用中使用該模塊:

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

// hook up all routes from some_routes with the path prefix of /greeting
app.use('/greetings', some_routes);

請投票並接受@jfriend00 的回答,這非常有幫助。 (我的聲望不夠)

簡而言之:

對於對象:

express 應用程序可以自己路由,整個代碼庫中只能有一個應用程序,因此如果需要模塊化多個路由而無需傳遞應用程序引用,我們寧願擁有多個路由器並將它們導入根應用程序。

路由器是一種專用的路由工具,您可以擁有多個路由,然后連接到 express 應用程序。

對於現在的方法:

use() 是基本方法的包裝器,您可以在其中指定公共資源,例如跨多個基本端點的中間件,而

get() 用於在其 use() 包裝器中指定的任何指定的先前路由之上指定端點。

暫無
暫無

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

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