2014-12-01 14 views
46

Tôi chỉ đọc tài liệu về nhanh và tìm thấy hai thuật ngữ này, app.use();router.use();Sự khác biệt giữa app.use() và router.use() trong tốc

Tôi biết app.use(); được sử dụng trong nút cho Gắn một middleware tại một đường dẫn và chúng tôi thường sử dụng nó trong hầu hết các ứng dụng nút. nhưng những gì là router.use(); là cả hai đều giống nhau? nếu không, sự khác biệt là gì?

Tôi đã đọc về bộ định tuyến here. Tôi cũng tìm thấy các câu hỏi tương tự trên SO What is the difference between "express.Router" and routing using "app.get"?Difference between app.all('*') and app.use('/'), nhưng chúng không thực sự trả lời câu hỏi của tôi. Cảm ơn.

+0

Cảm ơn bạn đã chấp nhận câu trả lời của tôi :) –

Trả lời

54

router.get chỉ để xác định subpath. Hãy xem xét ví dụ sau:

var router = express.Router(); 

app.use('/first', router); // Mount the router as middleware at path /first 

router.get('/sud', smaller); 

router.get('/user', bigger); 

Bây giờ nếu bạn sẽ mở /đầu/sud trong trình duyệt của bạn, sau đó smaller chức năng sẽ được gọi. Nếu bạn sẽ mở đầu tiên/người dùng thì bigger sẽ được gọi. Tóm lại, app.use ('/ first', router) gắn kết phần trung gian ở đường dẫn /first, sau đó router.get đặt đường phụ cho phù hợp.

Nhưng nếu chúng ta thay vì sử dụng:

app.use('/first', fun); 

app.get('/sud', bigger); 

app.get('/user', smaller); 

Bây giờ nếu bạn sẽ mở /đầu tiên trong trình duyệt của bạn sau đó fun sẽ được gọi và cho /sud, bigger sẽ được gọi và cho /user, chức năng smaller sẽ được gọi. ... nhưng hãy nhớ ở đây cho /đầu tiên/sud, không có chức năng nào sẽ được gọi.

Liên kết này cũng có thể giúp: http://expressjs.com/api.html#router

+0

Tôi đã chỉnh sửa câu trả lời của tôi @NaeemShaikh pls có một relook. –

+1

Nhưng tại sao sử dụng bộ định tuyến khi bạn có thể sử dụng app.use ('/ first/sud', nhỏ hơn); và app.use ('/ first/user', lớn hơn)? Tôi có nghĩa là họ đã tạo ra bộ định tuyến để chúng ta không phải gõ thêm công cụ trong tham số đầu tiên? – mskw

+0

nhìn đẹp câu hỏi tôi không biết nó một cách chính xác nhưng tôi nghĩ rằng đây là điều thực sự định tuyến đã được thực hiện để dicrecting trên url nơi app.use được thực hiện cho middleware bây giờ bạn có thể useapp.use ('/ first/sud', nhỏ hơn); nhưng giả sử trong ứng dụng của bạn có nhiều tuyến bắt đầu bằng/đầu/giây/thứ ba/thứ tư bây giờ bạn sẽ tạo mọi tuyến đường ở đây/thứ nhất/giây/thứ ba/thứ tư/x, không bạn sẽ sử dụng bộ định tuyến ở đây nhớ cả hai hoạt động tuyệt vời nhưng bộ định tuyến được tạo ra chỉ dành cho những mục đích url này –

47

router.use(); gắn kết middleware cho các tuyến đường phục vụ bởi các bộ định tuyến cụ thể, gắn kết app.use(); middleware cho tất cả các tuyến đường của ứng dụng (hoặc những người phù hợp với các tuyến đường quy định nếu bạn sử dụng app.use('/ANYROUTESHERE', yourMiddleware());).

Trường hợp sử dụng mẫu có thể là ứng dụng với một bộ định tuyến có các tuyến tiêu chuẩn và một bộ định tuyến xử lý các tuyến api, cần người dùng hợp lệ.

Sau đó, bạn sẽ gắn phần mềm trung gian xác thực cho bộ định tuyến api chỉ với router.use(yourAuthMiddleware());.

Nếu bạn muốn có một ứng dụng mặc dù yêu cầu người dùng hợp lệ cho tất cả các tuyến đường, gắn kết trung gian cho các ứng dụng với app.use(yourAuthMiddleware());

+0

Tôi có thể tạo bộ định tuyến mới và sau đó 'sử dụng 'nó trong bộ định tuyến khác không? Giống như 'router1.use ('/ path', router2);' – CodyBugstein

+1

Vâng, nó hoạt động tốt – mvuajua

+2

Câu trả lời này rõ ràng và phải là câu trả lời được chấp nhận. Router thường bị lạm dụng khi ứng dụng phù hợp hơn. – zehelvion

1

app.use() được sử dụng để gắn kết các chức năng trung gian hoặc các chức năng tại đường dẫn quy định, chức năng trung gian được thực hiện khi cơ sở của con đường yêu cầu phù hợp với con đường.

router.use() được sử dụng cho chức năng hoặc hàm trung gian, Giá trị mặc định gắn đường dẫn đến “/”.

Nhưng trong ứng dụng .sử dụng(), bạn sẽ phải từ bỏ một con đường quy định như thế:

var adsRouter = require('./adsRouter.js'); 
    app.use('/ads', adsRouter); 

hoặc

app.use('/ads', function(req, res, next) { 

    // write your callback code here. 

    }); 

Nhưng khi sử dụng router.use(), bạn có thể đưa ra chỉ middleware, như thế này:

router.use(function(req, res, next) { 
    console.log('%s %s %s', req.method, req.url, req.path); 
    next(); 
}); 

hoặc

router.use('/test', function(req, res, next) { 
    // write your callback code here. 
    next(); 
}); 

hoặc

//in router.js 

router.use('/admin', authUtil.verifySessionId, authUtil.verifyLisencee); 
router.post('/admin', controllerIndex.ads.adListingAdmin); 

Trong đoạn mã trên khi điểm cuối cùng là '/ admin' thì trước tiên nó sẽ gọi authUtil.verifySessionId và authUtil.verifyLisencee sau đó nó sẽ thực hiện dòng tiếp theo với 'admin' điểm cuối và theo phương thức controllerIndex.ads.adListingAdmin.

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