Perbedaan antara express.Router dan app.get?

265

Saya mulai dengan NodeJS dan Express 4, dan saya agak bingung. Saya telah membaca situs web Express, tetapi tidak bisa melihat kapan harus menggunakan pengendali rute atau kapan harus menggunakan express.Router.

Seperti yang dapat saya lihat, jika saya ingin menampilkan halaman atau sesuatu ketika pengguna mengklik /showmisalnya saya harus menggunakan:

var express = require('express')    
var app = express()    
app.get("/show", someFunction)  

Pada awalnya, saya pikir ini sudah tua (untuk Express 3). Apakah itu benar atau ini juga cara untuk Express 4?

Jika ini cara untuk melakukannya di Express 4, untuk apa express.Router?

Saya membaca contoh yang hampir sama seperti di atas tetapi menggunakan express.Router:

var express = require('express');
var router = express.Router();
router.get("/show", someFunction)

Jadi, apa perbedaan antara kedua contoh tersebut?

Yang mana yang harus saya gunakan jika saya hanya ingin melakukan situs web pengujian sederhana?

nelson687
sumber
27
A Routertidak .listen()untuk permintaan sendiri. Ini berguna untuk memisahkan aplikasi Anda menjadi beberapa modul - membuat Routersetiap modul appdapat require()dan .use()sebagai middleware.
Jonathan Lonowski
5
Seperti yang diindikasikan @JonathanLonowski, app.get(..)sintaksnya hanyalah jalan pintas untuk membuat bekerja dengan express.routerlebih nyaman. Jika Anda baru memulai, jangan khawatir tentang spesifikasi router.
soulprovidr
1
jadi Anda mengatakan bahwa saya harus menggunakan untuk saat ini hanya app.get ()? masih bingung tentang kapan harus menggunakan satu atau yang lain
nelson687
11
@ nelson687 Sebenarnya tidak ada aturan sulit di antara mereka. Jika Anda merasa app'smetode perutean sendiri, seperti app.get(), cukup untuk kebutuhan Anda, gunakan saja. The Routerhanya ada untuk kenyamanan untuk membantu Anda mengatur aplikasi di beberapa modul. Dari panduan : " The express.Routerclass dapat digunakan untuk membuat modular penangan rute mountable A. RouterMisalnya adalah middleware yang lengkap dan sistem routing yang, karena alasan ini sering disebut sebagai 'mini-app'. "
Jonathan Lonowski

Jawaban:

323

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;

Saat var app = express()dipanggil, objek aplikasi dikembalikan. Anggap ini sebagai aplikasi utama .

Ketika var router = express.Router()dipanggil, aplikasi mini yang sedikit berbeda dikembalikan. Gagasan di balik aplikasi mini adalah bahwa setiap rute di aplikasi Anda bisa menjadi sangat rumit, dan Anda akan mendapat manfaat dari memindahkan semua kode itu ke file terpisah. Setiap router file menjadi aplikasi mini , yang memiliki struktur yang sangat mirip dengan aplikasi utama .

Pada contoh di atas, kode untuk rute / dogs telah dipindahkan ke file sendiri sehingga tidak mengacaukan aplikasi utama . Kode untuk / kucing dan / burung akan disusun dengan cara yang sama dalam file mereka sendiri. Dengan memisahkan kode ini menjadi tiga aplikasi mini , Anda dapat mengerjakan logika untuk masing-masing secara terpisah, dan tidak khawatir tentang bagaimana hal itu akan memengaruhi dua lainnya.

Jika Anda memiliki kode (middleware) yang berkaitan dengan ketiga rute, Anda dapat meletakkannya di aplikasi utama , sebelum app.use(...)panggilan. Jika Anda memiliki kode (middleware) yang hanya berkaitan dengan salah satu rute itu, Anda dapat memasukkannya ke file untuk rute itu saja.

Nocturno
sumber
seharusnya Anda tidak harus meneruskan objek aplikasi app.use('/dogs', dogs)(app)karena Anda menentukan rute di sana, juga (dan perbaiki saya jika saya salah) jika Anda melakukannya dengan cara ini objek aplikasi memiliki semua perangkat tengah yang sebelumnya ditempatkan di atasnya dan tambahan barang tengah akan ditambahkan ke objek aplikasi (dengan asumsi lebih banyak barang tengah dalam rute anjing). jika Anda menggunakannya route.get('/dogs', route)hanya meneruskan perangkat tengah ke objek aplikasi saat berinteraksi dengan rute yang ditentukan dalam router itu dan jika cakupan aplikasi berada di luar rute, perangkat itu tidak memiliki akses ke perangkat tengah itu.
Ravenous
1
Anda tidak perlu meneruskan aplikasi ke rute, karena rute tersebut dilewatkan ke aplikasi bersama app.use('/dogs', show). Dengan cara ini, rute tidak tergantung pada aplikasi, dan dapat digunakan kembali dalam aplikasi Express apa pun. Middleware ditempatkan di mana saja sebelum rute digunakan oleh rute itu. Jika Anda menempatkan middleware di atas semua rute di app.js, maka semua rute akan menggunakan middleware itu. Jika Anda menempatkan middleware di dalam file rute (dogs.js), hanya rute itu yang akan menggunakannya. Jika Anda menempatkan middleware setelah rute GET di dalam dogs.js, maka hanya rute POST yang akan menggunakannya (selama itu berakhir dengan respons).
Nocturno
Ahh salahku. Saya bermaksud mengatakan app.get('/dogs'dogs,)(app)karena pertanyaannya adalah tentang fitur get app.get dan route.get. Anda menunjukkan cara memisahkan rute agar dapat dikelola. Tapi bukankah anakdot saya benar jika kita berbicara tentang app.get? Jika saya dapat menggunakan PC saya akan mengedit komentar saya di atas.
Ravenous
2
Aplikasi saya masih berfungsi ketika saya menggunakan express.Router () atau express (), saya tidak bisa memahami perbedaannya :(
Ajay Suwalka
3
@ Jay Suwalka Saya tidak tahu bagaimana saya bisa menguraikan lebih lanjut tentang apa yang sudah saya katakan. Dokumen mengatakan "Objek router adalah turunan middleware dan rute yang terisolasi". Saya juga suka @Jonathan Lonowski komentar di atas, "A Routertidak .listen()untuk permintaan sendiri". Itu mungkin perbedaan utama.
Nocturno
29

Express 4.0 hadir dengan Router baru. Sebagaimana disebutkan di situs:

Kelas express.Router dapat digunakan untuk membuat penangan rute modular yang dapat dipasang. Sebuah instance Router adalah middleware dan sistem routing yang lengkap; untuk alasan ini sering disebut sebagai "aplikasi mini".

Ada artikel bagus di https://scotch.io/tutorials/learn-to-use-the-new-router-in-expressjs-4 yang menjelaskan perbedaan dan apa yang dapat dilakukan dengan router.

Untuk meringkas

Dengan router Anda dapat memodulasi kode Anda dengan lebih mudah. Anda dapat menggunakan router sebagai:

  1. Rute Dasar: Beranda, Tentang
  2. Rute Middleware untuk mencatat permintaan ke konsol
  3. Rute dengan Parameter
  4. Rute Middleware untuk Parameter untuk memvalidasi parameter tertentu
  5. Memvalidasi parameter yang diteruskan ke rute tertentu

catatan:

The app.routerobjek, yang telah dihapus di Express bintang 4, telah membuat cerdas in ekspres 5. Pada versi baru, itu adalah hanya referensi ke dasar Ekspres router, tidak seperti di Ekspres 3, di mana sebuah aplikasi harus secara eksplisit memuat itu.

Alireza Fattahi
sumber
7
app.route('/book')
  .get(function (req, res) {
    res.send('Get a random book')
  })
  .post(function (req, res) {
    res.send('Post a random book')
  })

Seperti pada contoh di atas, kita dapat menambahkan metode permintaan HTTP berbeda di bawah rute.

TILAK
sumber
5

Katakanlah aplikasi Anda sedikit rumit. Jadi apa yang kita lakukan pertama adalah kita membagi aplikasi menjadi beberapa modul sehingga perubahan dalam satu modul tidak mengacaukan yang lain dan Anda dapat terus bekerja pada modul individu, tetapi pada akhirnya Anda perlu mengintegrasikan semuanya menjadi satu karena Anda sedang membangun satu aplikasi. Sepertinya kita memiliki satu aplikasi utama dan beberapa aplikasi anak yang orang tuanya adalah aplikasi utama. Jadi ketika kita membuat aplikasi induk, kita membuatnya menggunakan

var express = require('express');
var parent = express();

Dan untuk aplikasi induk ini kita perlu memasukkan aplikasi anak. Tetapi karena aplikasi anak bukanlah aplikasi yang sama sekali berbeda (karena mereka berjalan dalam konteks konteks-java yang sama), express menyediakan cara untuk melakukannya dengan cara pada fungsi Router Expresse dan ini adalah apa yang kita lakukan di setiap file modul anak dan mari kita memanggil satu modul anak seperti aboutme .

var express = require('express');
var router = express.Router();
/**
** do something here
**/
module.exports = router;

Dengan module.exports kita membuat modul ini tersedia untuk dikonsumsi orang lain dan karena kita telah memodulasi hal-hal yang kita butuhkan untuk membuat file modul tersedia untuk aplikasi induk melalui fungsi simpul yang membutuhkan fungsi seperti modul pihak ketiga lainnya dan file induk terlihat sesuatu seperti ini.

var express = require('express') 
var parent = express() 
var child = require(./aboutme)

setelah kita membuat modul anak ini tersedia untuk orang tua kita perlu memberi tahu aplikasi orang tua kapan harus menggunakan aplikasi anak ini. Katakanlah ketika pengguna menyentuh jalan tentang saya, kita membutuhkan aplikasi anak tentang saya untuk menangani permintaan dan kami melakukannya dengan menggunakan metode penggunaan Expresse .

parent.use('/aboutme',  aboutme);

dan dalam satu kesempatan file induk terlihat seperti ini

var express = require('express');
var parent = express();
var child = require(./aboutme);
/***
**do some stuff here
**/
parent.use('/aboutme',child);

Di atas semua yang dapat dilakukan orang tua adalah dapat memulai server di mana sebagai anak tidak bisa. Semoga ini bisa menjelaskan. Untuk informasi lebih lanjut, Anda selalu dapat melihat kode sumber yang membutuhkan waktu tetapi memberi Anda banyak informasi. Terima kasih.

raj240
sumber
1
bukankah ini seharusnya parent.use('/aboutme', child)?
Kees de Kooter
2

menggunakan app.js untuk menulis rute berarti mereka dapat diakses oleh semua pengguna karena app.js dimuat saat aplikasi dimulai. Namun, menempatkan rute dalam aplikasi mini express.router () melindungi dan membatasi aksesibilitasnya.

T.Soundarya
sumber
2

express.Router memiliki banyak pilihan:

  • aktifkan sensitivitas huruf besar: /showrute tidak sama dengan /Show, perilaku ini dinonaktifkan secara default
  • mode perutean yang ketat: /show/rute ke tidak sama dengan /show, perilaku ini juga dinonaktifkan secara default
  • kita bisa menambahkan middleware tertentu ke rute tertentu
Ahmed Alawady
sumber
0

Singkatnya, express.Routerdapat melakukan lebih banyak hal ketika dibandingkan dengan app.get(), seperti middleware, apalagi, Anda dapat mendefinisikan satu lagi objek router denganexpress.Router()

yuanfang wang
sumber