Node.js 'Connect, Express ve “ara katman yazılımı” nedir?


634

JavaScript'i oldukça iyi tanımasına rağmen , Node.js ekosistemindeki bu üç projenin tam olarak ne yaptığını kafam karıştı . Rails 'Rack gibi bir şey mi? Birisi açıklayabilir mi lütfen?


1
Connect kullanmadım, ancak bu sayfa kesinlikle Rails 'Rack'a benziyor. Düğüm bağlamı dışında ara katman yazılımının ne olduğunu anlıyor musunuz?
Matt Ball

Dürüst olmak gerekirse, istediğim kadar değil. Bildiğim kadarıyla yönlendirme, gzipping, başlıklar, çerezler gibi tüm uygulama öncesi şeyleri yapan katman ..? Haklı mıyım? Öyleyse, MVC çerçevesinin içinde değil (Rails gibi) değil, ara katman yazılımında uygun MVC denetleyicisine / eylemine yönlendirilecek şekilde çalışıyor mu?
Mart'ta tillda


8
BU TÜM ÇİFTLERİNİZİ TEMİZLEYECEK VE CEVAP OLDUĞUNUZ DAHA FAZLA SORUN DAHA FAZLA SORUN (umarım birisi aşağı kayar ...), ancak aşağıdaki blog makalesini okumak Connect, Express ve Middleware ile ilgili tüm soruları silecektir . Ayrıca size Node.js hakkında da biraz bilgi verir. http://evanhahn.com/understanding-express/
DotNetInfo

@DiegoCaxito Bağlantınız koptu.
Direk

Yanıtlar:


891

[ Güncelleme: Express 4.0 sürümünden itibaren artık Connect kullanmıyor. Ancak, Express yine de Connect için yazılan ara yazılım ile uyumludur. Orijinal cevabım aşağıda.]

Bunu sorduğunuza sevindim, çünkü Node.js'ye bakan insanlar için kesinlikle ortak bir karışıklık noktası. İşte en iyi açıklamam:

  • Node.js , yöntemi HTTP isteklerine yanıt vermek için kullanabileceğiniz bir nesne döndüren bir http modülü sunar createServer. Bu nesne http.Serverprototipi devralır .

  • Connect ayrıca, createServergenişletilmiş sürümünü devralan bir nesneyi döndüren bir yöntem de sunar http.Server. Connect'in uzantıları, ara katman yazılımını takmayı kolaylaştırmak için temel olarak oradadır . Bu yüzden Connect kendisini bir "ara katman yazılımı çerçevesi" olarak tanımlar ve genellikle Ruby'nin Rafına analoglaştırılır.

  • Express , Connect'in http modülüne ne yaptığını Connect'e yapar: createServerConnect'in Serverprototipini genişleten bir yöntem sunar . Connect'in tüm işlevleri orada, artı görüntüleme oluşturma ve rotaları tanımlamak için kullanışlı bir DSL. Ruby Sinatra iyi bir benzetme.

  • Sonra daha da ileri gidip Express'i genişleten başka çerçeveler var! Örneğin Zappa , CoffeeScript, sunucu tarafı jQuery ve test desteğini birleştirir.

İşte "ara katman yazılımı" ile kastedilenin somut bir örneği: Kutunun dışında, yukarıdakilerin hiçbiri sizin için statik dosyalar sunmuyor. Ancak connect.static, bir dizini işaret edecek şekilde yapılandırılmış olarak (Connect ile birlikte gelen bir ara katman yazılımı) atın ve sunucunuz bu dizindeki dosyalara erişim sağlayacaktır. Express'in Connect'in orta ürünlerini de sağladığını unutmayın; express.staticile aynıdır connect.static. (Her ikisi de staticProvideryakın zamana kadar biliniyordu .)

Benim izlenimim, çoğu "gerçek" Node.js uygulamasının Express ile bugünlerde geliştirildiği; eklediği özellikler son derece kullanışlıdır ve isterseniz alt düzey işlevlerin tümü hala oradadır.


130
Connect ile ilgili beni üzen bir şey, belgelerinin Düğümün bir HTTP sunucusundan daha fazlası olduğunu kabul etmediği. "Connect, Node.js için bir ara katman yazılımı çerçevesi" - hayır, "Connect, Node.js HTTP sunucusu için bir ara katman yazılımı çerçevesi"
ince

46
Sanırım bunu çok fazla okuyorsun. Connect yapıcılar önde gelen Düğüm geliştiricileridir; Düğümün bir HTTP sunucusundan daha fazlası olduğunun farkındalar. Ancak yerleşik bir HTTP sunucusu var ve Connect, Node.js uygulamanızda kullanabileceğiniz bir ara katman yazılımı çerçevesi.
Trevor Burnham

22
Oh, eminim Connect yapıcılar bunun tamamen farkındalar. Düğüm hakkında kapsamlı bir anlayışa sahip olmadan sahip olduklarını başaramazlardı. Ancak yeni başlayanlar için Düğüm kelimelerinin seçimi kafa karıştırıcı; ve yeni gelenlere bağlanın.
ince

10
berrak, tüm cevapların ne için çabalaması gerekir Mükemmel iş Trevor.
Mark Essel

6
Harika bir açıklama. Bunun gibi cevaplar yeni insanların Node.js ekosistemine girmesine yardımcı olur. Node.js'de web uygulamaları geliştirmeye aşina olan insanlar için Express başlangıç ​​noktasıdır. Ruby benzetmesine devam etmek için Express, Sinatra ile karşılaştırılabilir. Ajax istemci tarafı uygulamaları için JSON API'leri oluşturmak özellikle harikadır. Bulduğum bir şey, bir uygulama belirli bir karmaşıklık seviyesine ulaştığında, daha fazla Rails gibi başka bir katmana ihtiyaç duyulmasıdır. Bu amaçla, Express'in üstünde daha fazla katman olan Lokomotif üzerinde çalışıyorum .
Jared Hanson

159

Kabul edilen cevap gerçekten eski (ve şimdi yanlış). Connect (3.0) / Express'in (4.0) geçerli sürümüne dayalı bilgiler (kaynakla birlikte).

Node.js ile birlikte gelenler

http / https createServer , yalnızca bir geri arama (req, res) alır ör.

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

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

});

server.listen(3000);

Connect ne ekliyor?

Middleware temel olarak uygulama kodunuz ile düşük seviye API'niz arasında bulunan herhangi bir yazılımdır. Connect, yerleşik HTTP sunucusu işlevini genişletir ve bir eklenti çerçevesi ekler. Eklentiler ara katman yazılımı gibi davranır ve bu nedenle bağlan bir ara katman yazılımı çerçevesidir

Bu şekilde oldukça basit ( ve aslında kod gerçekten kısa! ). Aradığınızda var connect = require('connect'); var app = connect();şunları appyapabileceğiniz bir fonksiyon elde edersiniz :

  1. Bir isteği işleyebilir ve bir yanıt verebilir. Bunun nedeni, temel olarak bu işlevi almanızdır.
  2. Üye işlevi vardır .use( kaynak yönetmek için) eklentileri ( buradan geliyor çünkü bu kod basit çizgi ).

Nedeniyle 1.) aşağıdakileri yapabilirsiniz:

var app = connect();

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

2. ile birleştirin ve elde edersiniz:

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 http, çağrıyı yapmanıza gerek kalmayacak şekilde kendisini kaydetmek için bir yardımcı program işlevi sağlar http.createServer(app). Denir listenve kod basitçe yeni bir http sunucusu oluşturur, registerer's callback olarak connect ve argümanları iletir http.listen. Kaynaktan

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

Böylece şunları yapabilirsiniz:

var connect = require('connect');

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

Hala senin yaşlısın http.createServerÜstte bir eklenti çerçevesi ile .

ExpressJS neler ekler

ExpressJS ve connect paralel projelerdir. Connect etkinliği sadece güzel bir katman çerçeve, useişlevi. Express, Connect'e bağlı değildir ( bkz. Package.json ). Ancak bağlanan her şeyi yapar yani:

  1. createServerSadece bir req/ respair ( kaynak ) alabilen bir işlev olduğu için benzer bağlantı ile kaydedilebilir .
  2. Ara katman yazılımı kaydetmek için bir kullanım işlevi .
  3. Kendini http ile kaydettiren bir yardımcı program listenişlevi

Bağlanmanın sağladığı şeylere ek olarak (kopyaları ifade eder), bir dizi daha fazla özelliğe sahiptir. Örneğin

  1. Has görünümü motoru desteği .
  2. Yönlendiricisi için üst düzey fiiller (get / post vb.) Vardır .
  3. Has uygulama ayarları desteği.

Ara yazılım paylaşılır

useExpressJS fonksiyonu ve bağlantı uyumlu ve bu nedenle ara katman paylaşılır . Her ikisi de ara katman yazılımı çerçeveleri, express sadece basit bir ara katman yazılımı çerçevesinden daha fazlasına sahiptir .

Hangisini kullanmalısın?

Benim düşüncem: kendi seçiminizi yapmak için yeterince yukarıda ^ dayalı ^ bilgilendirilir.

  • http.createServerSıfırdan connect / expressjs gibi bir şey oluşturuyorsanız kullanın .
  • Üst katmanda güzel bir soyutlama olduğu için ara katman yazılımı, test protokolleri vb. http.createServer
  • Web siteleri yazıyorsanız ExpressJS kullanın.

Çoğu kişi sadece ExpressJS kullanmalıdır.

Kabul edilen cevapta yanlış olan ne

Bunlar bir zaman noktası olarak doğru olabilirdi, ama şimdi yanlış:

http.Server'ın genişletilmiş bir sürümünü devralır

Yanlış. Onu uzatmaz ve gördüğünüz gibi ... kullanır

Express, Connect'in http modülüne ne yaptığını bağlamak için yapar

Express 4.0 bağlantıya bile bağlı değildir. geçerli package.json bağımlılıkları bölümüne bakın


Diyorsun ki size bir isteği işleme ve yanıt verme yeteneği veriyor ama insanlar Express'in gerçekten web sunucusu olduğunu söylüyorlar ... Kafam karıştı. Yanıt geri göndermek için web sunucusu yeteneği (Express gibi) gerekmez mi?
PositiveGuy

1
iyi şeyler, teşekkürler! çok yararlı ... özellikle bağlanma gerçekten yönlendirme bilmiyorum yönlendirme sağlayan ve ifade sadece miras, yönlendirme tek / kaynak sağlayıcısı değil. Ve sonunda kullanım durumları faydalıdır çünkü bağlan ve ekspres kullanmam gerektiğini varsaydım, ancak gerçekten kullanmanız gereken tek şey web uygulamaları için ekspres olduğundan, bu benim için büyük bir şeyi temizledi. Her ikisini de kurmazsınız, birini ya da diğerini kurarsınız!
PositiveGuy

Cevabınız üstte olmalı. kabul edilen cevabı okuduğumda, iptal ettim. Ama cevabını okuduktan sonra ... naahhh
Arun Joshla

67

node.js

Node.js, sunucu tarafı için bir javascript motorudur.
Tüm js özelliklerine ek olarak, ağ yetenekleri (HTTP gibi) ve dosya sistemine erişim içerir.
Bu, ağ görevlerinin tarayıcı tarafından tekelleştirildiği ve güvenlik nedeniyle dosya sistemine erişimin yasaklandığı istemci tarafı j'lerden farklıdır.

web sunucusu olarak node.js: ekspres

Sunucuda çalışan, HTTP'yi anlayan ve web sunucusu gibi dosya seslerine erişebilen bir şey. Ama bu bir değil.
Node.js'nin bir web sunucusu gibi davranmasını sağlamak için programlanması gerekir: gelen HTTP isteklerini işlemek ve uygun yanıtları sağlamak.
Express'in yaptığı budur: js'de bir web sunucusunun uygulanmasıdır.
Böylece, bir web sitesi uygulamak, Hızlı rotaları yapılandırmak ve sitenin belirli özelliklerini programlamak gibidir.

Middleware ve Connect

Sayfaları sunmak bir dizi görevi içerir. Bu görevlerin çoğu iyi bilinir ve çok yaygındır, bu nedenle düğümün Connect modülü (düğüm altında çalıştırılabilen birçok modülden biri) bu görevleri uygular.
Mevcut etkileyici teklife bakın:

  • özel biçim desteği ile logger istek logger
  • csrf Siteler arası istek sahteciliği koruması
  • sıkıştırmak Gzip sıkıştırma ara katman yazılımı
  • basicAuth temel http kimlik doğrulaması
  • bodyParser genişletilebilir istek vücut ayrıştırıcısı
  • json uygulaması / json ayrıştırıcı
  • urlencoded uygulama / x-www-form-urlencoded ayrıştırıcı
  • çok parçalı çok parçalı / form veri ayrıştırıcısı
  • zaman aşımı isteği zaman aşımı
  • cookieParser çerez ayrıştırıcı
  • session MemoryStore ile oturum yönetimi desteği
  • cookieSession çerez tabanlı oturum desteği
  • methodOverride sahte HTTP yöntemi desteği
  • responseTime, yanıt süresini hesaplar ve X-Response-Time ile poz verir
  • static () ara katman yazılımı için staticCache bellek önbellek katmanı
  • Aralık ve daha fazlasını destekleyen statik akış statik dosya sunucusu
  • dizin dizin listesi ara katman yazılımı
  • vhost sanal ana bilgisayar alt alan eşleme ara katman yazılımı
  • favicon verimli favicon sunucusu (varsayılan simgeli)
  • limit istek gövdelerinin bayt boyutunu sınırlar
  • sorgu otomatik sorgu dizesi ayrıştırıcı, doldurma req.query
  • errorHandler esnek hata işleyici

Connect çerçevedir ve bu sayede ihtiyacınız olan (alt) modülleri seçebilirsiniz. Katkıda
Bulunan Orta Katman yazılımı , ek orta yolların uzun bir listesini listeler .
Express'in kendisi en yaygın Connect ara yazılımları ile birlikte gelir.

Ne yapalım?

Node.js yükler.
Düğüm , düğüm paket yöneticisi npm ile birlikte gelir . Komut , global olarak express'i indirip kuracaktır ( ekspres kılavuzunu kontrol edin ). Koşu (değil düğümünde) bir komut satırında bir hazır vadede uygulama adında foo yaratacaktır. (Yeni oluşturulan) dizinine geçin ve komutla düğümü kullanarak çalıştırın , sonra açın ve görün. Şimdi içerdesin.
npm install -g express
express foonode <appname>http://localhost:3000


3
büyük cevap teşekkürler. Bu her blog yazısı özlüyor basit bok tür, basit kurulum olabilir ??? daha önce hiç yapmadıysan. Evet, zaten yaptığınızda basit ama İLK kez nasıl başlayacağınıza dair hiçbir fikriniz yok! Blog yayınlarında devs göz ardı ettiğinde nefret ediyorum, bu çok önemli. Sadece kurulumu bulmak için başka bir blog yazısı bulmak zorunda değilim. Diğer yazılarınızdaki başka bir blog yayınına bir bağlantı sağlayın, bu son derece yararlı, bu yüzden bir tane için avlamak zorunda değilim. Kurtar beni av gezisi!
PositiveGuy

3
Express 4.0.0 sudo npm install -g express-generator yapmalı
mohamed-ibrahim

@getsetbro sadece bağımlılıkları kurmak için 'npm install' demek istediniz.
Torsten Barthel

16

Connect, oturum yönetimi, kimlik doğrulama, günlük tutma ve daha fazlası gibi yaygın HTTP sunucusu işlevleri için "daha üst düzey" API'ler sunar. Express, gelişmiş (Sinatra benzeri) işlevsellik ile Connect'in üzerine kurulmuştur.


0

Node.jskendisi, createServer yöntemi HTTP isteklerine yanıt vermek için kullanabileceğiniz bir nesne döndüren bir HTTP modülü sunar . Bu nesne http.Serverprototipi devralır .


0

Özellikle Visual Studio IDE ile çalışmak için NTVS kullanıyorsanız ilgili bilgiler. NTVS, Visual Studio 2012, 2013'e hem NodeJS hem de Express araçları, iskele, proje şablonları ekler.

Ayrıca, ExpressJS veya Connect'i "WebSunucusu" olarak çağıran sözcük yanlıştır. Onlarla veya onlarsız temel bir WebSunucu oluşturabilirsiniz. Temel bir NodeJS programı, http isteklerini işlemek için http modülünü de kullanabilir, böylece temel bir web sunucusu haline gelir.


0

adından da anlaşılacağı gibi middleware middleware orta arasında oturup .. ne ortasında? istek ve yanıt ortasında .. nasıl istek, yanıt, ekspres sunucu oturmak bu resimde ekspres app oturmak istemcileri gelen görebilirsiniz görebilirsiniz sonra ekspres sunucu sunucusu bu istekleri hizmet .. sonra daha derin kazmak sağlar .. aslında biz bunu bölebilirsiniz tüm ekspres sunucunun tüm görevi gibi küçük ayrı görevlere bu şekilde. ara katman nasıl istek ve yanıt arasında oturup bazı belirli bir görev yapıyor ve bir sonrakine istek geçti sunucu parçaları küçük yığın .. nihayet tüm görevler yapılıyor tepki yapıldı .. tüm orta eşya istek nesnesi, yanıt nesnesi ve bir sonraki istek fonksiyonu erişebilirsiniz tepki döngüsü ..

Bu, katman yazılımı için ekspres youtube videosunda katman yazılımını açıklamak için iyi bir örnektir


-7

Aptalca basit cevap

Connect ve Express, düğümler için web sunucularidir. Apache ve IIS'den farklı olarak, ikisi de "ara katman yazılımı" olarak adlandırılan aynı modülleri kullanabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.