Express.Router ve app.get arasındaki farklar?


265

NodeJS ve Express 4 ile başlıyorum ve biraz kafam karıştı. Express web sitesini okuyordum, ancak ne zaman yol işleyici kullanacağınızı veya ne zaman kullanacağınızı göremiyorum express.Router.

Görebildiğim gibi, kullanıcı /showörneğin isabet zaman bir sayfa veya bir şey göstermek istiyorsanız kullanmalıyım:

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

Başlangıçta, bunun eski olduğunu düşündüm (Express 3 için). Bu doğru mu yoksa Express 4 için de yol bu mu?

Express 4'te bunu yapmanın yolu buysa, ne için express.Routerkullanılır?

Hemen hemen yukarıdaki ile aynı örneği okudum ama kullanarak express.Router:

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

Her iki örnek arasındaki fark nedir?

Sadece basit bir test web sitesi yapmak istiyorsam hangisini kullanmalıyım?


27
A tek başına istekler için Routerdeğildir .listen(). Uygulamanızı birden çok modüle ayırmak için yararlıdır - Routerher birinde appkutu require()ve .use()ara katman yazılımı olarak bir tane oluşturun.
Jonathan Lonowski

5
@JonathanLonowski'nin işaret ettiği gibi, app.get(..)sözdizimi çalışmayı express.routerdaha kolay hale getirmek için sadece bir kısayoldur . Yeni başlıyorsanız, yönlendiricinin özellikleri hakkında endişelenmeyin.
soulprovidr

1
yani sadece app.get () için kullanmam gerektiğini söylüyorsun? hala bir tane ya da başka ne zaman kullanılacağına dair karıştı
nelson687

11
@ nelson687 Aralarında gerçekten zor bir kural yok. Eğer hissediyorsanız app'sgibi kendi yönlendirme yöntemleri, app.get()senin ihtiyaçları için yeterlidir, bunları kullanın. RouterKolaylık Birden modüller arasında uygulama düzenlemenize yardımcı olmak için sadece vardır. Kılavuzundan : " sınıf modüler monte rota işleyicileri oluşturmak için kullanılabilecek bir. Örneğinin tam orta katman ve yönlendirme sistemidir; bu nedenle sık sık bir olarak adlandırılır 'mini app'. "express.RouterRouter
Jonathan Lonowski

Yanıtlar:


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;

Zaman var app = express()olarak adlandırılır, bir uygulama nesnesi döndürülür. Bunu ana uygulama olarak düşünün .

Arandığında var router = express.Router(), biraz farklı bir mini uygulama döndürülür. Mini uygulamanın arkasındaki fikir, uygulamanızdaki her bir yolun oldukça karmaşık hale gelebilmesi ve tüm bu kodu ayrı bir dosyaya taşımanızın faydası olacaktır. Her dosyanın yönlendiricisi , ana uygulamaya çok benzer bir yapıya sahip olan mini bir uygulama haline gelir .

Yukarıdaki örnekte, / dogs yolunun kodu kendi uygulamasına taşınmıştır, böylece ana uygulamayı karıştırmaz . / Cats ve / birds için kodlar kendi dosyalarında benzer şekilde yapılandırılır. Bu kodu üç mini uygulamaya ayırarak , her biri için ayrı ayrı mantık üzerinde çalışabilir ve diğer ikisini nasıl etkileyeceği konusunda endişelenmeyebilirsiniz.

Üç rotanın hepsiyle ilgili kodunuz (ara katman yazılımı) varsa , aramalardan önce ana uygulamaya koyabilirsiniz app.use(...). Bu yollardan yalnızca birine ait olan kodunuz (ara katman yazılımı) varsa, yalnızca bu yol için dosyaya koyabilirsiniz.


app.use('/dogs', dogs)(app)ek olarak oraya uygulama nesnesini iletmeniz gerekmemelidir , ek olarak (ve yanılıyorsam beni düzelt) Bu şekilde yaparsanız uygulama nesnesi daha önce yerleştirilmiş tüm orta eşyaya sahiptir. ve ek orta eşya uygulama nesnesine eklenecektir (daha fazla orta eşya köpek yolunda olduğu varsayılarak). kullanırsanız route.get('/dogs', route), orta yönlendiriciyi yalnızca bu yönlendiricide tanımlanan yollarla etkileşime girerken uygulama nesnesine geçirir ve uygulamanın kapsamı yolun dışındaysa söz konusu orta ürüne erişimi olmaz.
Ravenous

1
Uygulamayı rotaya geçirmeniz gerekmez, çünkü rota uygulamaya aktarılıyor app.use('/dogs', show). Bu şekilde rota uygulamadan bağımsızdır ve herhangi bir Express uygulamasında yeniden kullanılabilir. Bir rota o rota tarafından kullanılmadan önce herhangi bir yere yerleştirilen ara katman yazılımı. Middleware'i app.js'deki tüm yolların üzerine yerleştirirseniz, tüm rotalar bu ara katmanı kullanır. Ara katman yazılımını bir rota dosyasının (dogs.js) içine yerleştirirseniz, yalnızca bu rota onu kullanır. Middleware'i dogs.js içindeki GET yolundan sonra yerleştirirseniz, yalnızca POST yolu onu kullanır (bir yanıtla bittiği sürece).
Nocturno

Ahh benim hatam. app.get('/dogs'dogs,)(app)Soruyu app.get ve route.get'in get özelliği ile ilgili olduğu için koymak istedim. onları yönetilebilir kılmak için yolları nasıl ayıracağınızı gösteriyordunuz. Ama eğer konuşuyorsak anacdote'um doğru olmaz app.getmı? Bir PC'ye girebilirsem yukarıdaki yorumumu düzenlerim.
Ravenous

2
Ekspres.Router () veya express () kullandığımda Uygulamam hala çalışıyor, farkı anlayamadım :(
Ajay Suwalka

3
@Ajay Suwalka Daha önce söylediklerimi nasıl daha fazla ayrıntılandırabileceğimi bilmiyorum. Dokümanlar, "Yönlendirici nesnesi, ara katman yazılımlarının ve yolların yalıtılmış bir örneğidir" der. Ayrıca @Jonathan Lonowski yukarıdaki yorumu da beğendim, "A kendi başına isteklerde Routerbulunmuyor .listen()". Temel fark bu olabilir.
Nocturno

29

Express 4.0 yeni Router ile birlikte geliyor. Sitede belirtildiği gibi:

Express.Router sınıfı, modüler monte edilebilir rota işleyicileri oluşturmak için kullanılabilir. Yönlendirici örneği tam bir ara katman yazılımı ve yönlendirme sistemidir; bu nedenle genellikle “mini uygulama” olarak adlandırılır.

Https://scotch.io/tutorials/learn-to-use-the-new-router-in-expressjs-4 adresinde farklılıkları ve yönlendiricilerle neler yapılabileceğini anlatan iyi bir makale bulunmaktadır .

Özetlemek

Yönlendiriciler ile kodunuzu daha kolay modüle edebilirsiniz. Yönlendiricileri şu şekilde kullanabilirsiniz:

  1. Temel Rotalar: Ev, Hakkında
  2. İstekleri konsola kaydetmek için Middleware'i yönlendirin
  3. Parametreli Rota
  4. Belirli parametreleri doğrulamak için Parametreleri Yönlendirme
  5. Belirli bir rotaya iletilen bir parametreyi doğrular

Not:

app.routerExpress 4 çıkarıldı amacı, bu bir uygulama açıkça yüklemek zorunda Express 3, farklı olarak, baz Hızlı yönlendiriciye bir referans, yeni versiyonda Express 5 bir dönüş yaptı.


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

Yukarıdaki örnekte olduğu gibi, bir rotaya farklı HTTP istek yöntemi ekleyebiliriz.


5

Diyelim ki başvurunuz biraz karmaşık. İlk önce yaptığımız şey, bir modüldeki değişikliklerin diğerlerini karıştırmaması ve bireysel modüller üzerinde çalışmaya devam edebilmeniz için uygulamayı birden fazla modüle böleriz, ancak günün sonunda her şeyi bir taneye entegre etmeniz gerekir. tek bir uygulama geliştiriyoruz. Sanki bir ana uygulamamız ve ana uygulaması olan az sayıda çocuk uygulamamız var. Üst uygulamayı oluşturduğumuzda

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

Ve bu ebeveyn uygulamasına alt uygulamaları getirmemiz gerekiyor. Ancak alt uygulamalar tamamen farklı uygulamalar olmadığından (aynı bağlam-java teriminde çalıştıkları için), Express'in Yönlendirici işlevi aracılığıyla bunu yapmanın yolunu sağlar ve her alt modül dosyasında yaptığımız budur ve olarak böyle bir çocuk modülü çağrı sağlar aboutme .

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

By module.exports Tükettiğimiz ve bir şeyleri modularized beri biz modül düğümü yılların vasıtasıyla üst uygulamada kullanılabilir dosyaları yapmak gerekir tıpkı diğer üçüncü parti modülleri ve Üst dosya görünüyor gibi işlev gerektiren diğer için bu modülü mevcut yapıyoruz böyle bir şey.

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

bu alt modülü üst öğe için kullanılabilir hale getirdikten sonra, üst uygulamaya bu alt uygulamayı ne zaman kullanacağını söylememiz gerekir. Bir kullanıcı benim hakkımda patikaya geldiğinde, isteğin üstesinden gelmek için benimle ilgili çocuk uygulamasına ihtiyacımız olduğunu ve bunu Expresse'nin kullanım yöntemini kullanarak yaptığımızı söyleyelim .

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

ve bir çekimde üst dosya şöyle görünür

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

Ebeveynin yapabileceği her şeyden önce, çocuğun yapamadığı bir sunucu başlatabilir. Umarım bu açıklığa kavuşur. Daha fazla bilgi için her zaman biraz zaman alan kaynak koduna bakabilirsiniz, ancak size çok fazla bilgi verir. Teşekkür ederim.


1
bu olmamalı parent.use('/aboutme', child)mı?
Kees de Kooter

2

Güzergah yazmak için app.js kullanmak, uygulama başlangıcında app.js yüklendikçe tüm kullanıcıların erişebileceği anlamına gelir. Ancak, express.router () mini uygulamalarına rota koymak erişilebilirliklerini korur ve kısıtlar.


2

express.Router birçok seçeneği vardır:

  • büyük / küçük harfe duyarlılığı etkinleştir: /showrota ile aynı olmamak/Show , bu davranış varsayılan olarak devre dışıdır
  • katı yönlendirme modu: /show/ile aynı yol/show , bu davranış da varsayılan olarak devre dışıdır
  • belirli rotalara belirli ara katman yazılımları ekleyebiliriz

0

Tek kelimeyle, ara katman yazılımı gibi express.Routerkarşılaştırıldığında daha fazla şey yapabilir app.get(), ayrıca bir yönlendirici nesnesi ileexpress.Router()

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.