ความแตกต่างระหว่าง app.use () และ router.use () ใน Express


92

ฉันเพิ่งอ่านเอกสารเกี่ยวกับ Express และพบคำศัพท์ทั้งสองนี้app.use();และrouter.use();

ฉันรู้ว่าapp.use();ใช้ในโหนดสำหรับการติดตั้งมิดเดิลแวร์ที่พา ธ และเรามักใช้ในแอปโหนดส่วนใหญ่ แต่router.use();ทั้งคู่เหมือนกันเพราะอะไร? ถ้าไม่แตกต่างกันอย่างไร?

ฉันอ่านเกี่ยวกับเราเตอร์ที่นี่ ฉันยังพบคำถามที่คล้ายกันใน SO อะไรคือความแตกต่างระหว่าง "express.Router" และการกำหนดเส้นทางโดยใช้ "app.get"? และความแตกต่างระหว่าง app.all ('*') และ app.use ('/')แต่พวกเขาไม่ได้ตอบคำถามของฉันจริงๆ ขอบคุณ.

คำตอบ:


126

router.getใช้สำหรับกำหนดเส้นทางย่อยเท่านั้น ลองพิจารณาตัวอย่างนี้:

var router = express.Router();

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

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

router.get('/user', bigger);
  • ถ้าคุณเปิด/ แรก / sudแล้วsmallerฟังก์ชั่นจะได้รับการเรียกว่า
  • ถ้าคุณเปิด/ แรก / ผู้ใช้แล้วbiggerฟังก์ชั่นจะได้รับการเรียกว่า

กล่าวโดยย่อคือapp.use('/first', router)เมานต์มิดเดิลแวร์ที่ path / firstจากนั้นrouter.getตั้งค่า subpath ตามนั้น


แต่ถ้าเราใช้สิ่งต่อไปนี้แทน:

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

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

app.get('/user', smaller);
  • หากคุณเปิด/ ครั้งแรกในเบราว์เซอร์ของคุณfunจะถูกเรียก
  • สำหรับ/ sud , biggerจะได้รับการเรียกว่า
  • สำหรับผู้ใช้ / , smallerจะได้รับการเรียกว่า

แต่จำไว้ว่าสำหรับ/ first / sud จะไม่มีการเรียกใช้ฟังก์ชัน

ลิงก์นี้อาจช่วยได้: http://expressjs.com/api.html#router


ฉันได้แก้ไขคำตอบของฉันแล้ว @NaeemShaikh กรุณาลองใหม่
Sudhanshu Gaur

4
แต่ทำไมต้องใช้เราเตอร์ในเมื่อคุณสามารถไปที่ app.use ('/ first / sud', เล็กกว่า); และ app.use ('/ first / user', ใหญ่กว่า)? ฉันหมายความว่าพวกเขาสร้างเราเตอร์ดังนั้นเราจึงไม่ต้องพิมพ์สิ่งพิเศษในพารามิเตอร์แรกหรือไม่?
mskw

ดูเป็นคำถามที่ดีฉันไม่รู้ว่ามันถูกต้อง แต่ฉันคิดว่านี่เป็นสิ่งที่การกำหนดเส้นทางจริง ๆ ถูกสร้างขึ้นเพื่อการแก้ไข URL ที่ app.use สร้างขึ้นสำหรับมิดเดิลแวร์ตอนนี้คุณสามารถใช้app.use ('/ first / sud', เล็กกว่า); แต่สมมติว่าในแอปของคุณคุณมีหลายเส้นทางโดยเริ่มต้นเป็น / แรก / วินาที / สาม / สี่ตอนนี้คุณจะสร้างทุกเส้นทางที่นี่ / แรก / วินาที / สาม / สี่ / x คุณจะไม่ใช้เราเตอร์ที่นี่จำได้ว่าทั้งสองใช้งานได้ดี แต่เราเตอร์ สร้างขึ้นเพื่อวัตถุประสงค์ของ URL เหล่านี้
Sudhanshu Gaur

routerดังนั้นจึงหมายความว่าเราไม่สามารถทำรังโดยใช้ เราสามารถทำได้โดยapp. ถูกต้องหรือไม่
Mr_Perfect

1
เหตุใด OP จึงถามเกี่ยวกับrouter.useแต่คำตอบนี้ตอบกลับโดยอ้างถึงrouter.get?
Tim Heilman

74

router.use();เมานต์มิดเดิลแวร์สำหรับเส้นทางที่ให้บริการโดยเราเตอร์ที่ระบุapp.use();ติดตั้งมิดเดิลแวร์สำหรับเส้นทางทั้งหมดของแอพ (หรือที่ตรงกับเส้นทางที่ระบุหากคุณใช้app.use('/ANYROUTESHERE', yourMiddleware());)

ตัวอย่างกรณีการใช้งานอาจเป็นแอปที่มีเราเตอร์หนึ่งตัวที่มีเส้นทางมาตรฐานและเราเตอร์หนึ่งตัวที่จัดการเส้นทาง API ซึ่งต้องการผู้ใช้ที่ถูกต้อง

จากนั้นคุณจะติดตั้งมิดเดิลแวร์การตรวจสอบสิทธิ์สำหรับเราเตอร์ api ด้วยrouter.use(yourAuthMiddleware());.

หากคุณมีแอปที่ต้องการผู้ใช้ที่ถูกต้องสำหรับทุกเส้นทางให้ติดตั้งมิดเดิลแวร์สำหรับแอปด้วย app.use(yourAuthMiddleware());


ฉันสามารถสร้างเราเตอร์ใหม่แล้วสร้างuseในเราเตอร์อื่นได้หรือไม่ Likerouter1.use('/path', router2);
CodyBugstein

6
คำตอบนี้ชัดเจนและควรเป็นคำตอบที่ได้รับการยอมรับ เราเตอร์มักใช้ในทางที่ผิดซึ่งแอปจะเหมาะสมกว่า
AturSams

1

app.use () ใช้เพื่อติดตั้งฟังก์ชันมิดเดิลแวร์หรือฟังก์ชันที่พา ธ ที่ระบุฟังก์ชันมิดเดิลแวร์จะทำงานเมื่อฐานของพา ธ ที่ร้องขอตรงกับพา ธ

router.use () ใช้กับฟังก์ชันมิดเดิลแวร์หรือฟังก์ชันค่าเริ่มต้นจะกำหนดเส้นทางไปยัง“ /”

แต่ใน app.use () คุณจะต้องระบุเส้นทางเช่นนั้น:

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

หรือ

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

  // write your callback code here.

    });

แต่ในขณะที่ใช้ router.use () คุณสามารถให้เฉพาะมิดเดิลแวร์ดังนี้:

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

หรือ

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

หรือ

//in router.js

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

ในโค้ดด้านบนเมื่อจุดสิ้นสุดคือ '/ admin' ก่อนอื่นจะเรียกใช้ authUtil.verifySessionId และ authUtil.verifyLisencee จากนั้นจะดำเนินการบรรทัดถัดไปด้วยจุดสิ้นสุด 'admin' และตามเมธอด controllerIndex.ads.adListingAdmin


1
ไม่จำเป็นต้องระบุเส้นทางapp.useหากคุณต้องการเรียกใช้ฟังก์ชันสำหรับทุกคำขอที่ส่งไปยังแอป
jacefarm

@shubham คุณอธิบายได้ดีมากและเป็นประโยชน์กับฉันมาก ในกรณีของเราเตอร์ที่มีมิดเดิลแวร์เราสามารถรวมเป็นบรรทัดเดียวเช่น router.delete ("/: id / delete", middleware.checkToken, userController.deleteUser)
Sourabh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.