Perbedaan Antara app.use () dan router.use () di Express

92

Saya baru saja membaca dokumentasi tentang express dan menemukan dua istilah ini, app.use();danrouter.use();

Saya tahu app.use();digunakan di node untuk Memasang middleware di jalur, dan kami sering menggunakannya di sebagian besar aplikasi node. tapi apakah router.use();keduanya sama? jika tidak, apa bedanya?

Saya membaca tentang router di sini . Saya juga menemukan pertanyaan serupa di SO Apa perbedaan antara "express.Router" dan perutean menggunakan "app.get"? dan Perbedaan antara app.all ('*') dan app.use ('/') , tetapi mereka tidak benar-benar menjawab pertanyaan saya. Terima kasih.

Naeem Shaikh
sumber

Jawaban:

126

router.gethanya untuk menentukan sub jalur. Pertimbangkan contoh ini:

var router = express.Router();

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

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

router.get('/user', bigger);
  • Jika Anda membuka / first / sud , maka smallerfungsinya akan dipanggil.
  • Jika Anda membuka / first / user , maka biggerfungsi tersebut akan dipanggil.

Singkatnya, pasang app.use('/first', router)middleware di path / first , lalu router.getsetel subpath yang sesuai.


Tetapi jika kita malah menggunakan yang berikut ini:

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

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

app.get('/user', smaller);
  • Jika Anda membuka / pertama di browser Anda, funakan dipanggil,
  • Untuk / sud , biggerakan dipanggil
  • Untuk / pengguna , smallerakan dipanggil

Tapi ingat untuk / first / sud , tidak ada fungsi yang dipanggil.

Tautan ini juga dapat membantu: http://expressjs.com/api.html#router

Sudhanshu Gaur
sumber
Saya telah mengedit jawaban saya @NaeemShaikh, tolong lihat ulang.
Sudhanshu Gaur
4
Tapi mengapa menggunakan router saat Anda bisa pergi app.use ('/ first / sud', lebih kecil); dan app.use ('/ first / user', lebih besar)? Maksud saya, apakah mereka membuat router sehingga kami tidak perlu mengetikkan barang tambahan di parameter pertama?
mskw
pertanyaan yang bagus terlihat saya tidak mengetahuinya dengan benar tetapi saya pikir ini adalah hal yang sebenarnya perutean dibuat untuk mengoreksi url di mana app.use dibuat untuk middleware sekarang Anda dapat useapp.use ('/ first / sud', lebih kecil); tetapi misalkan di aplikasi Anda, Anda memiliki banyak rute dengan mulai sebagai / pertama / kedua / ketiga / keempat sekarang, apakah Anda akan membuat setiap rute di sini / pertama / kedua / ketiga / keempat / x, tidak, Anda akan menggunakan router di sini ingat keduanya berfungsi dengan baik tetapi router dibuat hanya untuk tujuan url ini
Sudhanshu Gaur
Jadi, artinya kita tidak bisa melakukan nesting menggunakan router. Kita hanya bisa melakukannya dengan app. Apakah itu benar?
Mr_Perfect
1
Mengapa OP bertanya tentang router.usetetapi jawaban ini menjawab mengacu pada router.get?
Tim Heilman
74

router.use();memasang middleware untuk rute yang dilayani oleh router tertentu, app.use();memasang middleware untuk semua rute aplikasi (atau yang cocok dengan rute yang ditentukan jika Anda menggunakanapp.use('/ANYROUTESHERE', yourMiddleware()); ).

Contoh kasus penggunaan dapat berupa aplikasi dengan satu router dengan rute standar dan satu router yang menangani rute api, yang membutuhkan pengguna yang valid.

Anda kemudian akan memasang middleware otentikasi untuk router api hanya dengan router.use(yourAuthMiddleware()); .

Jika Anda akan memiliki aplikasi yang membutuhkan pengguna yang valid untuk semua rute, pasang middleware untuk aplikasi tersebut dengan app.use(yourAuthMiddleware());

Laura
sumber
Dapatkah saya membuat router baru dan kemudian usemembuatnya di router lain? Sepertirouter1.use('/path', router2);
CodyBugstein
6
Jawaban ini jelas dan harus menjadi jawaban yang diterima. Router sering disalahgunakan di mana aplikasi akan lebih sesuai.
AturSams
1

app.use () digunakan untuk memasang fungsi middleware atau fungsi di jalur yang ditentukan, fungsi middleware dijalankan ketika basis jalur yang diminta cocok dengan jalur.

router.use () digunakan untuk fungsi atau fungsi middleware, secara default mount path ke "/".

Tetapi di app.use () Anda harus memberikan jalur yang ditentukan seperti itu:

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

atau

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

  // write your callback code here.

    });

Tetapi saat menggunakan router.use () Anda hanya dapat memberikan middleware, seperti ini:

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

atau

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

atau

//in router.js

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

Pada kode di atas ketika titik akhir adalah '/ admin' maka pertama akan memanggil authUtil.verifySessionId dan authUtil.verifyLisencee kemudian akan mengeksekusi baris berikutnya dengan titik akhir 'admin' dan sesuai dengan metode controllerIndex.ads.adListingAdmin.

Shubham Verma
sumber
1
Path tidak perlu disediakan app.usejika Anda ingin menjalankan fungsi untuk setiap permintaan yang dibuat ke aplikasi.
jacefarm
@shubham Anda menjelaskan dengan sangat baik dan itu sangat membantu saya. Dalam kasus router dengan middleware kita juga dapat menggabungkannya menjadi satu baris seperti router.delete ("/: id / delete", middleware.checkToken, userController.deleteUser)
Sourabh Bhutani