2015-02-03 43 views
137

Tôi bắt đầu với NodeJSExpress 4 và tôi hơi bối rối. Tôi đã đọc trang web express nhưng không thể thấy _khi sử dụng trình xử lý tuyến đường hoặc thời điểm sử dụng express.Router.Sự khác nhau giữa express.Router và app.get?

Như tôi có thể thấy, nếu tôi muốn hiển thị một trang hoặc một cái gì đó khi người dùng chạm /show ví 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ĩ rằng đây là cũ, cho express3, là đúng hay đây cũng là con đường cho express4?

Nếu đây là cách thực hiện trong express4, thì express.Router được sử dụng để làm gì?

Tôi đọc hầu hết các ví dụ tương tự 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 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?

+6

A 'Router' không '.listen()' cho yêu cầu riêng của mình. Nó rất hữu ích để tách ứng dụng của bạn thành nhiều mô-đun - tạo một 'Bộ định tuyến' trong mỗi phần tử' ứng dụng' có thể yêu cầu() 'và' .use() 'làm phần mềm trung gian. –

+2

Khi @JonathanLonowski gợi ý, cú pháp 'app.get (..)' chỉ là một phím tắt để làm việc với 'express.router' thuậ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

+0

vì vậy bạn đang nói rằng tôi nên sử dụng cho thời điểm này app.get()? vẫn còn bối rối khi sử dụng một hoặc một số khác – nelson687

Trả lời

169

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); 

dogs.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 express() được gọi trong app.js, một đối tượng ứng dụng được trả về. Hãy nghĩ về một đối tượng ứng dụng như một ứng dụng Express.

Khi express.Router() được gọi, một "ứng dụng nhỏ" hơi khác được trả về. Ý tưởng đằng sau "ứng dụng nhỏ" là các tuyến đường khác nhau trong ứng dụng của bạn có thể trở nên khá phức tạp và bạn sẽ được hưởng lợi từ việc chuyển logic đó thành một tệp riêng biệt.

Trong ví dụ đơn giản ở trên, logic cho tuyến đường /dogs đã được di chuyển vào tệp riêng của nó chỉ vì vậy trình xử lý GET và POST sẽ không lộn xộn lên app.js. Bây giờ bạn có thể làm việc trên logic cho bất kỳ yêu cầu nào để /dogs cách ly và không lo lắng về việc nó sẽ ảnh hưởng như thế nào đến /cats/birds.

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

+0

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

+0

Bạn không cần phải chuyển ứng dụng sang tuyến đường, vì tuyến đường đang được chuyển đến ứng dụng bằng 'app.use ('/ dogs', show)'. Bằng cách này, tuyến đường độ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 kỳ đâu trước khi 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 đường trong app.js, thì tất cả các tuyến đường sẽ sử dụng phần mềm trung gian đó. Nếu bạn đặt phần mềm trung gian bên trong một tệp tuyến đường (dogs.js), chỉ có 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 dogs.js, thì chỉ có tuyến POST sẽ sử dụng nó (miễn là nó kết thúc bằng phản hồi). – Nocturno

+0

Ahh xấu của tôi. Tôi có nghĩa là đặt '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 đã cho thấy cách tách các tuyến đường để làm cho chúng có thể quản lý được. Nhưng bản thuyết trình của tôi sẽ không chính xác nếu chúng ta đang nói về 'app.get'? Nếu tôi có thể sử dụng PC, tôi sẽ chỉnh sửa bình luận ở trên. – Ravenous

15

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

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

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.

Để summerize

Với router bạn có thể Modular mã của bạn dễ dàng hơn, bạn có thể sử dụng thiết bị định tuyến như:

  1. đường cơ bản: Trang chủ, Về
  2. Route Middleware để đăng nhập yêu cầu bảng điều khiển
  3. Định tuyến với thông số
  4. Định tuyến phần mềm trung gian cho Thông số để xác nhận thông số cụ thể
  5. Xác nhận một tham số truyền cho một lộ trình nhất định

Chú ý:

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

0
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 tôi có thể thêm phương thức yêu cầu HTTP khác theo một tuyến đường.

1

sử dụng app.js để viết tuyến có nghĩa là tất cả người dùng có thể truy cập vào ứng dụng 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() bảo vệ và hạn chế khả năng truy cập của chúng.

0

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

Các vấn đề liên quan