Sự khác nhau giữa express.Router và app.get?


265

Tôi đang bắt đầu với NodeJS và Express 4, và tôi hơi bối rối. Tôi đã đọc trang web Express, nhưng không thể biết khi nào nên sử dụng trình xử lý tuyến đường hoặc khi nào nên sử dụng express.Router.

Như tôi có thể thấy, nếu tôi muốn hiển thị một trang hoặc thứ gì đó khi người dùng truy cập, /showví dụ tôi nên sử dụng:

var express = require('express')    
var app = express()    
app.get("/show", someFunction)  

Lúc đầu, tôi nghĩ cái này đã cũ (đối với Express 3). Điều đó đúng hay đây cũng là cách dành cho Express 4?

Nếu đây là cách để làm điều đó trong Express 4, thì express.Routerdùng để làm gì?

Tôi đọc gần như ví dụ như trên nhưng sử dụng express.Router:

var express = require('express');
var router = express.Router();
router.get("/show", someFunction)

Vì vậy, sự khác biệt giữa cả hai ví dụ là gì?

Tôi nên sử dụng cái nào nếu tôi chỉ muốn làm một trang web thử nghiệm đơn giản?


27
A Routerkhông .listen()cho các yêu cầu của riêng mình. Nó rất hữu ích để phân tách ứng dụng của bạn thành nhiều mô-đun - tạo một Routertrong mỗi mô-đun appcó thể require().use()như là phần mềm trung gian.
Jonathan Lonowski

5
Như @JonathanLonowski gợi ý, app.get(..)cú pháp chỉ là một phím tắt để làm việc với express.routerthuận tiện hơn. Nếu bạn chỉ mới bắt đầu, đừng lo lắng về các chi tiết cụ thể của bộ định tuyến.
soulprovidr

1
vì vậy bạn đang nói rằng tôi chỉ nên sử dụng app.get ()? vẫn còn bối rối về việc khi nào nên sử dụng cái này hay cái khác
nelson687

11
@ nelson687 Thực sự không có một quy tắc khó thiết lập giữa chúng. Nếu bạn cảm thấy các app'sphương pháp định tuyến riêng, như app.get(), là đủ cho nhu cầu của bạn, hãy sử dụng chúng. Đây Routerlà tiện lợi để giúp bạn tổ chức ứng dụng trên nhiều mô-đun. Từ hướng dẫn : " Các express.Routerlớp có thể được sử dụng để tạo ra bộ xử lý đường mountable mô-đun A. RouterVí dụ là một trung đầy đủ và hệ thống định tuyến, vì lý do này nó thường được gọi là 'mini-ứng dụng'. "
Jonathan Lonowski

Câu trả lời:


323

app.js

var express = require('express'),
    dogs    = require('./routes/dogs'),
    cats    = require('./routes/cats'),
    birds   = require('./routes/birds');

var app = express();

app.use('/dogs',  dogs);
app.use('/cats',  cats);
app.use('/birds', birds);

app.listen(3000);

dog.js

var express = require('express');

var router = express.Router();

router.get('/', function(req, res) {
    res.send('GET handler for /dogs route.');
});

router.post('/', function(req, res) {
    res.send('POST handler for /dogs route.');
});

module.exports = router;

Khi var app = express()được gọi, một đối tượng ứng dụng được trả về. Hãy nghĩ về điều này như là ứng dụng chính .

Khi var router = express.Router()được gọi, một ứng dụng nhỏ hơi khác được trả lại. Ý tưởng đằng sau ứng dụng mini là mỗi tuyến đường trong ứng dụng của bạn có thể trở nên khá phức tạp và bạn sẽ được lợi từ việc chuyển tất cả mã đó thành một tệp riêng biệt. Mỗi bộ định tuyến của tệp trở thành một ứng dụng nhỏ , có cấu trúc rất giống với ứng dụng chính .

Trong ví dụ trên, mã cho tuyến đường / chó đã được chuyển vào tệp riêng của nó để nó không làm lộn xộn ứng dụng chính . Mã cho / mèo/ chim sẽ được cấu trúc tương tự trong các tệp riêng của chúng. Bằng cách tách mã này thành ba ứng dụng nhỏ , bạn có thể làm việc dựa trên logic cho từng ứng dụng và không lo lắng về việc nó sẽ ảnh hưởng đến hai ứng dụng kia như thế nào.

Nếu bạn có mã (phần mềm trung gian) liên quan đến cả ba tuyến, bạn có thể đặt mã đó vào ứng dụng chính trước các app.use(...)cuộc gọi. Nếu bạn có mã (phần mềm trung gian) chỉ liên quan đến một trong những tuyến đường đó, bạn chỉ có thể đặt mã đó vào tệp cho tuyến đường đó.


bạn không cần phải vượt qua đối tượng ứng dụng app.use('/dogs', dogs)(app)vì bạn đang xác định tuyến đường ở đó, ngoài ra (và sửa tôi nếu tôi sai) nếu bạn làm theo cách này thì đối tượng ứng dụng có tất cả các kho trung gian được đặt trước đó và kho trung gian bổ sung sẽ được thêm vào đối tượng ứng dụng (giả sử có thêm kho trung gian trong tuyến chó). nếu bạn sử dụng, route.get('/dogs', route)nó chỉ truyền phần giữa cho đối tượng ứng dụng khi tương tác với các tuyến được xác định trong bộ định tuyến đó và nếu phạm vi ứng dụng nằm ngoài tuyến thì nó không có quyền truy cập vào kho trung gian đó.
Quạ

1
Bạn không cần phải chuyển ứng dụng đến tuyến đường, vì tuyến đường đang được chuyển đến ứng dụng app.use('/dogs', show). Bằng cách này, tuyến đường này độc lập với ứng dụng và có thể được sử dụng lại trong bất kỳ ứng dụng Express nào. Middleware được đặt ở bất cứ đâu trước khi một tuyến đường được sử dụng bởi tuyến đường đó. Nếu bạn đặt phần mềm trung gian trên tất cả các tuyến trong app.js, thì tất cả các tuyến sẽ sử dụng phần mềm trung gian đó. Nếu bạn đặt phần mềm trung gian bên trong tệp tuyến đường (Dogs.js), chỉ tuyến đường đó sẽ sử dụng nó. Nếu bạn đặt phần mềm trung gian sau tuyến GET bên trong dog.js, thì chỉ có tuyến POST sẽ sử dụng nó (miễn là kết thúc bằng phản hồi).
Nocturno

Ahh xấu của tôi. Tôi muốn đặt ra app.get('/dogs'dogs,)(app)vì câu hỏi là về tính năng get của app.get và route.get. bạn đã chỉ ra cách tách các tuyến đường để làm cho chúng có thể quản lý được. Nhưng liệu anacdote của tôi có đúng không nếu chúng ta đang nói về app.get? Nếu tôi có thể vào PC, tôi sẽ chỉnh sửa nhận xét trên của mình.
Quạ

2
Ứng dụng của tôi vẫn hoạt động khi tôi sử dụng express.Router () hoặc express (), tôi không thể hiểu được sự khác biệt :(
Ajay Suwalka

3
@Ajay Suwalka Tôi không biết làm thế nào tôi có thể giải thích thêm về những gì tôi đã nói. Các tài liệu nói rằng "Một đối tượng bộ định tuyến là một thể hiện riêng biệt của phần mềm trung gian và các tuyến đường". Tôi cũng thích bình luận của @Jonathan Lonowski ở trên, " RouterKhông .listen()yêu cầu riêng". Đó có thể là sự khác biệt chính.
Nocturno

29

Express 4.0 đi kèm với Bộ định tuyến mới. Như đã đề cập trên trang web:

Lớp express.Router có thể được sử dụng để tạo các trình xử lý tuyến đường gắn kết mô-đun. Một phiên bản Router là một hệ thống định tuyến và phần mềm trung gian hoàn chỉnh; vì lý do này, nó thường được gọi là một ứng dụng mini của ứng dụng.

Có một bài viết hay tại https://scotch.io/tutorials/learn-to-use-the-new-router-in-expressjs-4 mô tả sự khác biệt và những gì có thể được thực hiện với bộ định tuyến.

Tóm tắt

Với bộ định tuyến, bạn có thể mô đun hóa mã của mình dễ dàng hơn. Bạn có thể sử dụng bộ định tuyến như:

  1. Các tuyến cơ bản: Trang chủ, Giới thiệu
  2. Định tuyến Middleware để ghi nhật ký yêu cầu vào bàn điều khiển
  3. Tuyến đường với các thông số
  4. Định tuyến Middleware cho Tham số để xác thực các tham số cụ thể
  5. Xác thực một tham số được truyền đến một tuyến đường nhất định

Ghi chú:

Đối app.routertượng, đã bị xóa trong Express 4, đã quay trở lại trong Express 5. Trong phiên bản mới, nó chỉ là một tham chiếu đến bộ định tuyến Express cơ sở, không giống như trong Express 3, nơi một ứng dụng phải tải nó một cách rõ ràng.


7
app.route('/book')
  .get(function (req, res) {
    res.send('Get a random book')
  })
  .post(function (req, res) {
    res.send('Post a random book')
  })

Như trong ví dụ trên, chúng ta có thể thêm phương thức yêu cầu HTTP khác nhau theo một tuyến đường.


5

Giả sử ứng dụng của bạn hơi phức tạp. Vì vậy, điều chúng tôi làm trước tiên là chúng tôi chia ứng dụng thành nhiều mô-đun để những thay đổi trong một mô-đun không làm lộn xộn các mô-đun khác và bạn có thể tiếp tục làm việc trên từng mô-đun riêng lẻ, nhưng vào cuối ngày, bạn cần tích hợp mọi thứ vào một mô-đun kể từ khi bạn đang xây dựng một ứng dụng duy nhất. Giống như chúng ta có một ứng dụng chính và một vài ứng dụng con có cha mẹ là ứng dụng chính. Vì vậy, khi chúng ta tạo ứng dụng mẹ, chúng ta tạo một ứng dụng bằng cách sử dụng

var express = require('express');
var parent = express();

Và với ứng dụng cha mẹ này, chúng ta cần đưa vào các ứng dụng con. Nhưng vì các ứng dụng con không phải là các ứng dụng hoàn toàn khác nhau (vì chúng chạy trong cùng một thuật ngữ ngữ cảnh-java), express cung cấp cách thức thực hiện bằng phương tiện trên chức năng Bộ định tuyến của Expresse và đây là những gì chúng tôi làm trong mỗi tệp mô-đun con và hãy gọi một mô đun con như vậy là aboutme .

var express = require('express');
var router = express.Router();
/**
** do something here
**/
module.exports = router;

Bằng module.exports, chúng tôi đang cung cấp mô-đun này cho người khác tiêu thụ và vì chúng tôi đã mô đun hóa những thứ chúng tôi cần để cung cấp các tệp mô-đun cho ứng dụng mẹ bằng chức năng yêu cầu của nút giống như bất kỳ mô-đun bên thứ ba nào khác và tệp cha mẹ trông một cái gì đó như thế này

var express = require('express') 
var parent = express() 
var child = require(./aboutme)

sau khi chúng tôi cung cấp mô đun con này cho phụ huynh, chúng tôi cần thông báo cho ứng dụng mẹ khi nào nên sử dụng ứng dụng con này. Hãy nói rằng khi người dùng truy cập vào đường dẫn về chúng tôi, chúng tôi cần ứng dụng con về tôi để xử lý yêu cầu và chúng tôi thực hiện bằng cách sử dụng phương thức sử dụng của Expresse .

parent.use('/aboutme',  aboutme);

và trong một lần bắn, tập tin cha mẹ trông như thế này

var express = require('express');
var parent = express();
var child = require(./aboutme);
/***
**do some stuff here
**/
parent.use('/aboutme',child);

Trên tất cả những gì cha mẹ có thể làm là nó có thể khởi động một máy chủ nơi mà đứa trẻ không thể. Hy vọng điều này làm rõ. Để biết thêm thông tin, bạn luôn có thể xem mã nguồn mất một chút thời gian nhưng nó cung cấp cho bạn rất nhiều thông tin. Cảm ơn bạn.


1
cái này không nên parent.use('/aboutme', child)sao?
Kees de Kooter

2

sử dụng app.js để viết các tuyến có nghĩa là tất cả người dùng có thể truy cập được khi app.js được tải khi bắt đầu ứng dụng. Tuy nhiên, việc đặt các tuyến đường trong các ứng dụng mini express.router () sẽ bảo vệ và hạn chế khả năng truy cập của chúng.


2

express.Router có nhiều lựa chọn:

  • cho phép phân biệt chữ hoa chữ thường: /showđịnh tuyến không giống như /Show, hành vi này bị tắt theo mặc định
  • Chế độ định tuyến nghiêm ngặt: /show/định tuyến không giống như /show, hành vi này cũng bị tắt theo mặc định
  • chúng ta có thể thêm phần mềm trung gian cụ thể vào các tuyến cụ thể

0

Trong một từ, express.Routercó thể làm nhiều việc hơn khi so sánh app.get(), chẳng hạn như phần mềm trung gian, hơn nữa, bạn có thể định nghĩa thêm một đối tượng bộ định tuyến vớiexpress.Router()

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.