Apa itu Node.js 'Connect, Express, dan “middleware”?

634

Meskipun mengenal JavaScript dengan cukup baik, saya bingung apa yang sebenarnya dilakukan ketiga proyek di ekosistem Node.js ini. Apakah itu seperti Rails 'Rack? Bisakah seseorang tolong jelaskan?

tillda
sumber
1
Saya belum pernah menggunakan connect, tetapi halaman ini benar-benar membuatnya analog dengan Rails 'Rack. Apakah Anda mengerti apa itu middleware, di luar konteks Node?
Matt Ball
Jujur, tidak sebanyak yang saya mau. Sejauh yang saya tahu itu adalah lapisan yang melakukan semua hal pra-aplikasi seperti perutean, gzipping, header, cookie ..? Apakah saya benar? Jadi apakah itu bekerja dengan cara yang routing ke controller / action MVC yang tepat tidak di dalam kerangka MVC (seperti Rails), tetapi di middleware?
tillda
8
INI AKAN MEMBERSIHKAN SEMUA GANDA ANDA DAN JAWABAN BANYAK LEBIH BANYAK QUESTIES YANG ANDA PUNYA Saya mengerti bahwa ini sudah terlambat (semoga seseorang menggulir ke bawah ...), tetapi membaca artikel blog berikut ini akan menghapus semua pertanyaan yang Anda miliki tentang Connect, Express, dan Middleware . Ini juga mengajarkan Anda sedikit tentang Node.js juga. http://evanhahn.com/understanding-express/
DotNetInfo
@DiegoCaxito Tautan Anda rusak.
Mast

Jawaban:

891

[ Pembaruan: Pada rilis 4.0, Express tidak lagi menggunakan Connect. Namun, Express masih kompatibel dengan middleware yang ditulis untuk Connect. Jawaban asli saya di bawah.]

Saya senang Anda bertanya tentang ini, karena itu pasti merupakan titik kebingungan umum bagi orang-orang yang melihat Node.js. Inilah cara terbaik saya menjelaskannya:

  • Node.js sendiri menawarkan modul http , yang createServermetodenya mengembalikan objek yang dapat Anda gunakan untuk menanggapi permintaan HTTP. Objek itu mewarisi http.Serverprototipe.

  • Connect juga menawarkan createServermetode, yang mengembalikan objek yang mewarisi versi diperpanjang http.Server. Ekstensi Connect ada di sana untuk memudahkan memasang middleware . Itu sebabnya Connect menggambarkan dirinya sebagai "kerangka kerja middleware," dan sering dianalogikan dengan Ruby Rack.

  • Express tidak untuk Menghubungkan apa yang dilakukan Connect ke modul http: Menawarkan createServermetode yang memperluas Serverprototipe Connect . Jadi semua fungsi Connect ada di sana, ditambah tampilan rendering dan DSL yang praktis untuk menggambarkan rute. Sinatra Ruby adalah analogi yang bagus.

  • Lalu ada kerangka kerja lain yang melangkah lebih jauh dan memperluas Express! Zappa , misalnya, yang mengintegrasikan dukungan untuk CoffeeScript, jQuery sisi-server, dan pengujian.

Berikut ini adalah contoh nyata dari apa yang dimaksud dengan "middleware": Di luar kotak, tidak ada di atas yang menyajikan file statis untuk Anda. Tapi cukup lemparkan connect.static(middleware yang datang dengan Connect), yang dikonfigurasikan untuk menunjuk ke direktori, dan server Anda akan memberikan akses ke file di direktori itu. Perhatikan bahwa Express juga menyediakan middlewares Connect; express.staticsama dengan connect.static. (Keduanya dikenal staticProvidersampai saat ini.)

Kesan saya adalah bahwa sebagian besar aplikasi Node.js "nyata" sedang dikembangkan dengan Express hari ini; fitur yang ditambahkannya sangat berguna, dan semua fungsionalitas tingkat rendah masih ada jika Anda menginginkannya.

Trevor Burnham
sumber
130
Satu hal yang membuat saya kesal tentang Connect adalah bahwa dokumentasinya tampaknya tidak mengakui bahwa Node lebih dari sekadar server HTTP. "Connect adalah kerangka kerja middleware untuk Node.js" - tidak, "Connect adalah kerangka kerja middleware untuk server HTTP Node.js"
slim
46
@lim Saya pikir Anda terlalu banyak membaca. Pembuat Connect adalah pengembang Node yang unggul; mereka sadar betul bahwa Node lebih dari sekadar server HTTP. Tetapi ia memiliki server HTTP bawaan, dan Connect adalah kerangka middleware yang dapat Anda gunakan di aplikasi Node.js Anda.
Trevor Burnham
22
Oh, saya yakin pembuat Connect sepenuhnya menyadari hal itu. Mereka tidak bisa mencapai apa yang mereka miliki tanpa pemahaman yang mendalam tentang Node. Tetapi pilihan kata-kata membingungkan bagi pendatang baru ke Node; dan untuk pendatang baru untuk Terhubung.
langsing
10
sejernih kristal, apa semua jawaban harus diperjuangkan. Trevor bekerja dengan sangat baik.
Mark Essel
6
Penjelasan yang bagus. Jawaban seperti ini membantu membawa orang baru ke ekosistem Node.js. Bagi orang yang terbiasa mengembangkan aplikasi web di Node.js, Express adalah tempat untuk memulai. Untuk melanjutkan analogi Ruby, Express sebanding dengan Sinatra. Ini sangat bagus untuk membuat API JSON untuk aplikasi sisi klien Ajax. Satu hal yang saya temukan adalah bahwa sekali aplikasi mencapai tingkat kompleksitas tertentu, lapisan lain diperlukan yang lebih mirip Rails. Saya sedang mengerjakan Lokomotif untuk tujuan ini, yang selanjutnya berlapis di atas Express.
Jared Hanson
159

Jawaban yang diterima benar-benar tua (dan sekarang salah). Inilah informasi (dengan sumber) berdasarkan versi Connect (3.0) / Express (4.0) saat ini.

Apa Node.js datang dengan

http / https createServer yang hanya membutuhkan callback (req, res) misalnya

var server = http.createServer(function (request, response) {

    // respond
    response.write('hello client!');
    response.end();

});

server.listen(3000);

Apa yang terhubung menambahkan

Middleware pada dasarnya adalah perangkat lunak apa pun yang berada di antara kode aplikasi Anda dan beberapa API tingkat rendah. Connect memperluas fungsionalitas server HTTP bawaan dan menambahkan kerangka kerja plugin. Plugin bertindak sebagai middleware dan karenanya terhubung adalah kerangka kerja middleware

Caranya cukup sederhana ( dan sebenarnya kodenya sangat pendek! ). Segera setelah Anda menelepon, var connect = require('connect'); var app = connect();Anda mendapatkan fungsi appyang dapat:

  1. Dapat menangani permintaan dan mengembalikan respons. Ini karena pada dasarnya Anda dapatkan fungsi ini
  2. Memiliki fungsi anggota .use( sumber ) untuk mengelola plugin ( yang berasal dari sini karena baris kode sederhana ini ).

Karena 1.) Anda dapat melakukan hal berikut:

var app = connect();

// Register with http
http.createServer(app)
    .listen(3000);

Kombinasikan dengan 2.) dan Anda mendapatkan:

var connect = require('connect');

// Create a connect dispatcher
var app = connect()
      // register a middleware
      .use(function (req, res, next) { next(); });

// Register with http
http.createServer(app)
    .listen(3000);

Connect menyediakan fungsi utilitas untuk mendaftarkan diri httpsehingga Anda tidak perlu melakukan panggilan http.createServer(app). Disebut listendan kode hanya membuat server http baru, register terhubung sebagai panggilan balik dan meneruskan argumen http.listen. Dari sumber

app.listen = function(){
  var server = http.createServer(this);
  return server.listen.apply(server, arguments);
};

Jadi, Anda bisa melakukan:

var connect = require('connect');

// Create a connect dispatcher and register with http
var app = connect()
          .listen(3000);
console.log('server running on port 3000');

Itu masih tua baikmu http.createServer dengan kerangka plugin di atas.

Apa yang ditambahkan ExpressJS

ExpressJS dan terhubung adalah proyek paralel. Connect hanyalah kerangka middleware, dengan usefungsi yang bagus . Express tidak tergantung pada Connect ( lihat package.json ). Namun itu tidak semua yang terhubung tidak yaitu:

  1. Dapat didaftarkan dengan createServerlike connect karena itu juga hanya fungsi yang dapat mengambil req/ respasang ( sumber ).
  2. Sebuah fungsi penggunaan untuk mendaftar middleware .
  3. listenFungsi utilitas untuk mendaftarkan dirinya dengan http

Selain menyediakan apa yang terhubung (yang mengekspresikan duplikat), ia memiliki banyak fitur. misalnya

  1. Memiliki dukungan tampilan engine .
  2. Memiliki kata kerja tingkat atas (get / post dll) untuk router-nya .
  3. Memiliki dukungan pengaturan aplikasi .

Middleware dibagikan

The usefungsi ExpressJS dan connect kompatibel dan oleh karena itu middleware dibagi . Keduanya merupakan kerangka kerja middleware, express hanya memiliki lebih dari kerangka middleware sederhana .

Yang mana yang harus Anda gunakan?

Pendapat saya: Anda cukup informasi ^ berdasarkan di atas ^ untuk membuat pilihan Anda sendiri.

  • Gunakan http.createServerjika Anda membuat sesuatu seperti connect / expressjs dari awal.
  • Gunakan connect jika Anda membuat middleware, menguji protokol, dll. Karena ini adalah abstraksi yang bagus di atas http.createServer
  • Gunakan ExpressJS jika Anda membuat situs web.

Kebanyakan orang harus menggunakan ExpressJS.

Apa yang salah dengan jawaban yang diterima

Ini mungkin benar karena beberapa titik waktu, tetapi salah sekarang:

yang mewarisi versi diperpanjang dari http.Server

Salah. Itu tidak meluas dan seperti yang Anda lihat ... menggunakannya

Express tidak untuk Menghubungkan apa yang dilakukan Connect ke modul http

Express 4.0 bahkan tidak bergantung pada koneksi. lihat bagian dependensi package.json saat ini

basarat
sumber
Anda mengatakan memberi Anda kemampuan untuk menangani permintaan dan mengembalikan respons tetapi orang mengatakan bahwa Express benar-benar server web ... Saya bingung. Tidakkah mengirim respons kembali memerlukan kemampuan server web (seperti Express)?
PositiveGuy
1
barang bagus, terima kasih! sangat membantu ... terutama tidak mengetahui bahwa koneksi benar-benar menyediakan routing, dan menyatakan hanya mewarisi itu, itu bukan satu-satunya penyedia / sumber routing. Dan kasus penggunaan pada akhirnya sangat membantu karena saya berasumsi saya harus menggunakan connect AND express tetapi sebenarnya yang perlu Anda gunakan hanyalah express untuk aplikasi web, jadi ini sangat membantu saya. Anda tidak menginstal keduanya, Anda menginstal satu atau yang lain!
PositiveGuy
Jawaban Anda harus di atas. ketika saya membaca jawaban yang diterima, saya membatalkannya. Tetapi setelah membaca jawaban Anda ... naahhh
Arun Joshla
67

node.js

Node.js adalah motor javascript untuk sisi server.
Selain semua kemampuan js, ini mencakup kemampuan jaringan (seperti HTTP), dan akses ke sistem file.
Ini berbeda dari sisi klien di mana tugas-tugas jaringan dimonopoli oleh browser, dan akses ke sistem file dilarang untuk alasan keamanan.

node.js sebagai server web: express

Sesuatu yang berjalan di server, memahami HTTP dan dapat mengakses file terdengar seperti server web. Tapi itu bukan satu.
Untuk membuat node.js berperilaku seperti server web, Anda harus memprogramnya: menangani permintaan HTTP yang masuk dan memberikan respons yang sesuai.
Inilah yang dilakukan Express: ini adalah implementasi dari server web di js.
Dengan demikian, mengimplementasikan situs web seperti mengkonfigurasi rute Express, dan memprogram fitur spesifik situs.

Middleware dan Connect

Melayani halaman melibatkan sejumlah tugas. Banyak dari tugas-tugas tersebut diketahui dan sangat umum, sehingga modul Connect node (salah satu dari banyak modul yang tersedia untuk dijalankan di bawah node) mengimplementasikan tugas-tugas tersebut.
Lihat penawaran mengesankan saat ini:

  • logger request logger dengan dukungan format kustom
  • csrf Permintaan pemalsuan permintaan lintas situs
  • kompres middleware kompresi Gzip
  • basicAuth otentikasi http dasar
  • bodyParser extensible body parser permintaan
  • aplikasi json / parser json
  • aplikasi urlencoded / parser x-www-form-urlencoded
  • multipart multipart / form-data parser
  • batas waktu timeout permintaan
  • cookieParser cookie parser
  • sesi dukungan manajemen sesi dengan MemoryStore yang dibundel
  • cookieSession mendukung sesi berbasis cookie
  • methodOverride dukungan metode HTTP palsu
  • responseTime menghitung waktu respons dan mengekspos melalui X-Response-Time
  • staticCache memory cache layer untuk middleware statis ()
  • statis mengalir file server statis mendukung Range dan lebih
  • direktori direktori daftar middleware
  • vhost virtual host pemetaan sub-domain middleware
  • favicon efisien server favicon (dengan ikon default)
  • limit membatasi bytesize dari badan permintaan
  • query parser querystring otomatis, mengisi req.query
  • errorHandler penangan kesalahan yang fleksibel

Connect adalah kerangka kerja dan melaluinya Anda dapat memilih (sub) modul yang Anda butuhkan.
Halaman Contrib Middleware menyebutkan daftar panjang middlewares tambahan .
Express sendiri hadir dengan middlewares Connect yang paling umum.

Apa yang harus dilakukan?

Instal node.js.
Node dilengkapi dengan npm , manajer paket simpul .
Perintah npm install -g expressakan mengunduh dan menginstal express secara global (lihat panduan express ).
Berjalan express foodi baris perintah (bukan di simpul) akan membuat aplikasi siap-pakai yang bernama foo. Ubah ke direktori (yang baru dibuat) dan jalankan dengan simpul dengan perintah node <appname>, lalu buka http://localhost:3000dan lihat. Sekarang kamu masuk

Juan Lanus
sumber
3
jawaban yang bagus terima kasih. Ini adalah jenis omong kosong sederhana yang dilewatkan oleh setiap posting blog, pengaturan sederhana yang bisa dilakukan ??? jika Anda belum pernah melakukannya sebelumnya. Ya itu sederhana ketika Anda sudah melakukannya tetapi Anda tidak memiliki petunjuk bagaimana memulai untuk pertama kalinya! Aku benci ketika devs mengabaikan itu dalam posting blog, itu penting. Saya tidak ingin harus MENCARI posting blog lain hanya untuk menemukan pengaturan. Cukup berikan tautan ke posting blog lain di posting Anda yang lain, itu sangat membantu jadi saya tidak perlu mencari-cari. Selamatkan aku dari perjalanan berburu!
PositiveGuy
3
Express 4.0.0 perlu melakukan sudo npm install -g express-generator
mohamed-ibrahim
@ widgetetbro Anda hanya berarti 'npm install' untuk menginstal dependensi.
Torsten Barthel
16

Connect menawarkan API "tingkat lebih tinggi" untuk fungsionalitas server HTTP umum seperti manajemen sesi, otentikasi, pencatatan dan banyak lagi. Express dibangun di atas Connect dengan fungsionalitas canggih (seperti Sinatra).

yojimbo87
sumber
0

Node.jsitu sendiri menawarkan modul HTTP, yang metode createServer mengembalikan objek yang dapat Anda gunakan untuk menanggapi permintaan HTTP. Objek itu mewarisi http.Serverprototipe.

Suraj Kumar Yadav
sumber
0

Informasi terkait, terutama jika Anda menggunakan NTVS untuk bekerja dengan Visual Studio IDE. NTVS menambahkan alat NodeJS dan Express, perancah, templat proyek ke Visual Studio 2012, 2013.

Juga, kata-kata yang menyebut ExpressJS atau Connect sebagai "WebServer" tidak benar. Anda dapat membuat WebServer dasar dengan atau tanpa mereka. Program NodeJS dasar juga dapat menggunakan modul http untuk menangani permintaan http, sehingga menjadi server web yang belum sempurna.

Vic
sumber
0

middleware seperti namanya sebenarnya middleware duduk di tengah .. tengah apa? di tengah permintaan dan respons .. bagaimana permintaan, tanggapan, server kilat duduk di aplikasi kilat dalam gambar ini Anda dapat melihat permintaan berasal dari klien maka server server kilat melayani permintaan tersebut .. kemudian mari kita gali lebih dalam .. sebenarnya kita bisa membagi ini seluruh tugas server ekspres keseluruhan ke tugas-tugas terpisah kecil seperti dengan cara ini. bagaimana middleware duduk di antara permintaan dan respons sebagian kecil dari bagian server melakukan beberapa tugas tertentu dan meneruskan permintaan ke tugas berikutnya .. akhirnya melakukan semua tugas tanggapan yang telah dibuat .. semua perangkat menengah dapat mengakses objek permintaan, objek respons, dan fungsi permintaan berikutnya siklus respons ..

ini adalah contoh yang baik untuk menjelaskan middleware dalam video youtube ekspres untuk middleware

hasanga lakdinu
sumber
-7

Jawaban sederhana yang bodoh

Connect dan Express adalah server web untuk nodejs. Tidak seperti Apache dan IIS, keduanya dapat menggunakan modul yang sama, disebut sebagai "middleware".

kmiles
sumber