Sự khác biệt giữa app.use () và router.use () trong Express


88

Tôi vừa đọc tài liệu trên express và tìm thấy hai thuật ngữ này, app.use();router.use();

Tôi biết app.use();nó được sử dụng trong nút để Gắn phần mềm trung gian 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 router.use();cả hai đều giống nhau là gì? nếu không, sự khác biệt là gì?

Tôi đọc về bộ định tuyến ở đây . Tôi cũng tìm thấy các câu hỏi tương tự trên SO Sự khác biệt giữa "express.Router" và định tuyến bằng "app.get" là gì? Sự khác biệt giữa app.all ('*') và 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.

Câu trả lời:


122

router.getchỉ để xác định đường dẫn con. Hãy xem xét ví dụ này:

var router = express.Router();

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

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

router.get('/user', bigger);
  • Nếu bạn mở / first / sud , thì smallerhàm sẽ được gọi.
  • Nếu bạn mở / đầu tiên / người dùng , thì biggerhàm sẽ được gọi.

Nói tóm lại, app.use('/first', router)gắn kết phần mềm trung gian tại đường dẫn / đầu tiên , sau đó router.getđặt đường dẫn con cho phù hợp.


Nhưng nếu thay vào đó chúng ta sử dụng những điều sau:

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

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

app.get('/user', smaller);
  • Nếu bạn mở / đầu tiên trong trình duyệt của mình, funsẽ được gọi,
  • For / sud , biggersẽ được gọi
  • Đối với / người dùng , smallersẽ được gọi

Nhưng hãy nhớ đối với / first / sud , sẽ không có hàm nào được gọi.

Liên kết này cũng có thể hữu ích: http://expressjs.com/api.html#router


Tôi đã chỉnh sửa câu trả lời của mình @NaeemShaikh. Xin hãy xem lại.
Sudhanshu Bò tót

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

câu hỏi đẹp, tôi không biết chính xác nhưng tôi nghĩ đây là thứ thực sự định tuyến được tạo ra để phân tích các url nơi app.use được tạo cho phần mềm trung gian, 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, bạn có nhiều tuyến đường với bắt đầu là / đầu tiên / thứ hai / thứ ba / thứ tư bây giờ bạn có thực hiện mọi tuyến đường ở đây / đầu tiên / thứ hai / thứ ba / thứ tư / x không, bạn sẽ sử dụng bộ định tuyến ở đây nhớ cả hai đều hoạt động tốt nhưng bộ định tuyến được tạo ra chỉ cho những mục đích url này
Sudhanshu Bò tót

Vì vậy, nó có nghĩa là chúng ta không thể làm lồng bằng cách sử dụng router. Chúng tôi có thể làm chỉ bằng cách app. Đúng không?
Mr_Perfect

Tại sao OP hỏi liên quan đến router.usenhưng câu trả lời này trả lời đề cập đến router.get?
Tim Heilman

72

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

Trường hợp sử dụng ví dụ có thể là một ứng dụng có một bộ định tuyến với 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 yêu cầu người dùng hợp lệ cho tất cả các tuyến, hãy gắn phần mềm trung gian cho ứng dụng với app.use(yourAuthMiddleware());


Tôi có thể tạo một bộ định tuyến mới và sau đó đặt usenó trong một bộ định tuyến khác không? Thíchrouter1.use('/path', router2);
CodyBugstein

6
Câu trả lời này rõ ràng và phải là câu trả lời được chấp nhận. Bộ định tuyến thường bị lạm dụng khi ứng dụng sẽ phù hợp hơn.
AturSams

1

app.use () được sử dụng để Gắn kết chức năng phần mềm trung gian hoặc các chức năng tại đường dẫn được chỉ định, chức năng phần mềm trung gian được thực thi khi cơ sở của đường dẫn được yêu cầu khớp với đường dẫn.

router.use () được sử dụng cho chức năng hoặc chức năng của phần mềm trung gian, Đường dẫn gắn kết mặc định đến “/”.

Nhưng trong app.use (), bạn sẽ phải cung cấp một đường dẫn cụ thể như thế:

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

hoặc là

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

  // write your callback code here.

    });

Nhưng trong khi sử dụng router.use (), bạn chỉ có thể cung cấp phần mềm trung gian, như sau:

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

hoặc là

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

hoặc là

//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 kết thúc là '/ admin' thì đầu tiên nó sẽ gọi authUtil.verifySessionId và authUtil.verifyLisencee, sau đó nó sẽ thực thi dòng tiếp theo với điểm cuối 'admin' và theo phương thức controllerIndex.ads.adListingAdmin.


1
Không cần cung cấp đường dẫn app.usenếu bạn muốn thực thi chức năng cho mọi yêu cầu được thực hiện đối với ứng dụng.
jacefarm

@shubham Bạn đã giải thích rất tốt và nó rất hữu ích cho tôi. Trong trường hợp bộ định tuyến có phần mềm trung gian, chúng tôi cũng có thể hợp nhất nó thành một dòng như router.delete ("/: id / delete", middleware.checkToken, userController.deleteUser)
Sourabh Bhutani
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.