NodeJS / Express: “app.use” nedir?


332

In NodeJS için docs expressmodülü , örnek kod vardır app.use(...).

useİşlev nedir ve nerede tanımlanır?



Bu tür sorular dokümantasyon okunarak cevaplanabilir.
Mina

47
belgeler yeni başlayanlar için biraz şifreli
KansaiRobot 27:18

6
Yukarıdaki olası kopya birbirine
gönderme yapıyor

1
Belgeler tamamen belirsiz
Tessaracter

Yanıtlar:


370

Uygulama nesnesi, Express sunucusunun oluşturulmasında somutlaştırılır. Özelleştirilebilen bir ara katman yığınına sahiptir app.configure()(bu artık 4.x sürümünde kullanımdan kaldırılmıştır) .

Ara katman yazılımınızı ayarlamak için, app.use(<specific_middleware_layer_here>)eklemek istediğiniz her ara katman katmanı için çağırabilirsiniz (tüm yollarda genel olabilir veya yalnızca sunucunuzun işlediği belirli yollarda tetiklenebilir) ve Express ara katman yığınınıza eklenir . Ara katman katmanları, birden çok çağrıda tek tek eklenebilir use, hatta tek seferde seri olarak tek seferde eklenebilir . Daha fazla ayrıntı için usebelgelere bakın.

Express Middleware'in kavramsal olarak anlaşılması için bir örnek vermek gerekirse, uygulama nesnesimi konsola JSON olarak kaydederken uygulama ara katman yığını (app.stack) şöyle görünüyor:

stack: 
   [ { route: '', handle: [Function] },
     { route: '', handle: [Function: static] },
     { route: '', handle: [Function: bodyParser] },
     { route: '', handle: [Function: cookieParser] },
     { route: '', handle: [Function: session] },
     { route: '', handle: [Function: methodOverride] },
     { route: '', handle: [Function] },
     { route: '', handle: [Function] } ]

Eğer anlamak mümkün olabilir, ben denilen app.use(express.bodyParser()), app.use(express.cookieParser())vb, ortakatmanı bu ekspres katman 'katmanları' eklendi hangi. Yolların boş olduğuna dikkat edin, yani bu ara katman katmanlarını eklediğimde herhangi bir rotada tetikleneceklerini belirttim. Yukarıdaki yığın çıktısında söz konusu ara katman katmanı nesnesinin alanına /user/:idbir dize olarak yansıtılacak olan yolda tetiklenen özel bir katman katmanı eklediysem route.

Her katman, temelde ara katman yazılımından akışınıza bir şey işleyen bir işlev ekler.

Örneğin, ekleyerek bodyParser, sunucunuzun hızlı ara katman yazılımı aracılığıyla gelen istekleri işlemesini sağlarsınız . Yani, şimdi gelen isteklerin gövdesini ayrıştırmak, aradığınız için, gelen istekleri işlerken ara katman yazılımınızın aldığı prosedürün bir parçasıdırapp.use(bodyParser) .


116
teşekkür ederim. ekspres milletlerin bunu API belgelerinde açıklaması çok zor olur mu?
ericsoco

4
Yani bir istek alındığında verilerin gerçek hizmete ulaşmadan önce bu ayrıştırıcılardan geçirildiğini söylüyorsunuz. Örneğin: Geçerli İstek-> Kimlik Doğrulama-> ProcessesRequest-> ServResponse USE bu adımları belirli bir sırada kontrol eder ve paralel olarak yürütmez mi?
Adam Hess

2
Peki app.use () bağımlılığı enjeksiyonu çalışıyor mu?
Kevin C.

8
App.use dosyasına gönderilen işlev ne zaman çağrılır? Ekspres sunucuyu oluşturduktan sonra veya her istek için mi?
Timo Huovinen

5
@KevinC. Hayır, bağımlılık enjeksiyonu değildir. Bu bir eklenti mimarisidir. Genellikle bu tür mimariye filtre sistemi / filtre boru hattı / borusu ve filtre denir. Express'te boru, next()her ara yazılımın işlemeyi boru hattındaki bir sonraki işleve geçirmesi için çağrılacağı beklenen geri aramadır. Yönlendirme sistemi (ilk argüman app.use()), boru hattının URL'ye bağlı olarak dallanmasına izin verir
slebetman

50

useExpress HTTP sunucusu nesnesinin yolları tarafından kullanılan ara katman yazılımını yapılandırmak için kullanılan bir yöntemdir. Yöntem, Express'in temel aldığı Connect'in bir parçası olarak tanımlanır .

Güncelleme 4.x sürümünden başlayarak Express artık Connect'e bağlı değildir .

Daha önce Express'e dahil edilen ara katman yazılımı işlevleri artık ayrı modüllerde; ara katman fonksiyonlarının listesine bakınız .


3
Ve çevrimiçi dokümanlar burada: senchalabs.org/connect/proto.html#app.use
Alexander Bird

Bir Düğüm katman yazılımı nesneleri başlatırsa verimli olur mu? Bu, her isteğe bağlı olarak, ara katman yazılımının yeni nesneleri başlattığı anlamına mı gelir? Eski nesneler atılıyor mu? Örneğinapp.use(function(){ var object = new SomeConstructor; next(); })
CMCDragonkai

1
@CMCDragonkai Her istek üzerine nesneleri somutlaştırmak iyidir. İstek işleyicinizin kapsamı dışındaki nesnelere referansları saklamadığınız sürece çöp toplanırlar.
jeff_mcmahan

1
@AlexanderBird bağlantıları için thx (birincisi şimdi olsa kırık). Kayıt için, yalnızca 2. bağlantıdaki dokümanın başlangıcı "Verilen ara katman tutamaçını verilen rotaya kullan, varsayılan olarak / olarak değiştirir. Bu" rota ", / dışında bir değer verildiğinde ara katman için bağlantı noktasıdır. ara katman yazılımı yalnızca bu segment, isteğin yol adında mevcut olduğunda etkilidir.Örneğin, / admin konumunda bir işlev bağlayacak olsaydık, / admin ve / admin / settings üzerinde çağrılır, ancak / için çağrılmaz veya / posts ". Basit :)
Adrien

40

Her app.use (ara katman yazılımı) sunucuya her istek gönderildiğinde çağrılır.


7
Tek cümle cevabınız anında anlaşılabilir ve diğer çok paragraflı açıklamalardan daha yararlıdır.
17'de stackedAndOverflowed

16

app.use () için kullanılan ara katman işlevi veya belirtilen bir yola bağlanır, ara katman işlevi temel yol eşleştiğinde yürütülür.

Örneğin: indexRouter.js'de app.use () kullanıyorsanız, şöyle:

//indexRouter.js

var adsRouter = require('./adsRouter.js');

module.exports = function(app) {
    app.use('/ads', adsRouter);
}

Yukarıdaki kodda app.use () yolu adsRouter.js dosyasına '/ ads' dizinine bağlanır.

Şimdi adsRouter.js'de

// adsRouter.js

var router = require('express').Router();
var controllerIndex = require('../controller/index');
router.post('/show', controllerIndex.ads.showAd);
module.exports = router;

adsRouter.js'de, yol reklamlar '/ ads / show' için böyle olacak ve daha sonra controllerIndex.ads.showAd () yöntemine göre çalışacaktır.

app.use ([yol], geri arama, [geri arama]): aynı numaraya geri arama ekleyebiliriz.

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

  // write your callback code here.

    });

Anlamak daha kolay, "mount" yerine "harita" kullanırdım.
Jeb50

13

app.use () , ekspres uygulamalarda ara katman yazılımı görevi görür. Aksine app.get () ve app.post () ya da öylesine, aslında kullanabilirsiniz () app.use istek URL'si olmadan. Böyle bir durumda, hangi URL'nin vurulduğuna bakılmaksızın her seferinde yürütülür.


7

app.use () şu şekilde çalışır:

  1. İstek olayı, http sunucusu örneği düğümünde tetiklendi.
  2. express, bazı iç manipülasyonunu req nesnesi ile yapar.
  3. Bu, express'in app.use ile belirttiğiniz şeyleri yapmaya başladığı zamandır.

ki bu çok basit.

Ve ancak o zaman ekspres, yönlendirme gibi diğer şeyleri yapacaktır.


6
app.use(function middleware1(req, res, next){
   // middleware1 logic
}, function middleware1(req, res, next){
   // middleware2 logic
}, ... middlewareN);

app.use , ara katman yazılımı kayıt sırasının sırasına bağlı olarak herhangi bir son yol mantığı veya ara rota mantığı yürütmeden önce ara katman yazılımını veya ara yazılım zincirini (veya birden çok ara yazılım) kaydetmenin bir yoludur .

Middleware: formları zinciri fonksiyonları / katman fonksiyonları ile 3 parametre istemi, res, ve sonraki . bir sonraki adım, zincirdeki bir sonraki ara katman fonksiyonuna ve zincirin son ara katman fonksiyonuna karşılık geldikten sonra, bir sonraki kayıtlı ara katman zincirinin ilk ara katman fonksiyonuna işaret eder.


1
Tıkır tıkır çalışıyor !!
Anmol Rai

3

Ekspres "express" den ifade alırsak ve app = express (); sonra tüm ekspres işlevselliğine sahip uygulama

app.use () kullanırsak

tüm ekspres projede kullanmak için herhangi bir modül / ara katman fonksiyonu ile


3

app.useara yazılım gerektiren bir işlevdir. Örneğin:

 app.use('/user/:id', function (req, res, next) {
       console.log('Request Type:', req.method);
        next();
     });

Bu örnek, /user/:idyolda yüklü ara katman yazılımı işlevini gösterir . Bu işlev, /user/:idyoldaki herhangi bir HTTP isteği türü için yürütülür .

REST Web Sunucusuna benzer, sadece /xxfarklı eylemleri temsil etmek için farklı kullanın.


Cevabınız için teşekkürler, ancak bir başkası zaten tüm bu bilgileri söylediğinden, bunu onaylamam. Ekspresin useneler yapabileceğine dair her açıklamaya ihtiyacım olduğunu düşünmüyorum ; Sadece bunun ne olduğunu bilmem gerekiyordu (ve nasıl daha fazla araştırma yapacağımı bilmek için herhangi bir bağlam bilgisi).
Alexander Bird

3

app.use , uygulama isteği için ara katman yazılımı olarak çalışır . sözdizimi

app.use('pass request format',function which contain request response onject)

misal

app.use('/',funtion(req,res){
 console.log(all request pass through it);
// here u can check your authentication and other activities.
})

ayrıca isteğinizin yönlendirilmesi durumunda da kullanabilirsiniz.

app.use('/', roting_object);

2

Ara katman yazılımı, "birlikte yapıştırmaya" hizmet eden yazılım için genel bir terimdir, bu nedenle app.use, ara katman yazılımını yapılandırmak için bir yöntemdir, örneğin: istek gövdesini ayrıştırmak ve işlemek için: app.use (bodyParser.urlencoded ({extended: true) })); app.use (bodyParser.json ()); ekspres uygulamanızda kullanabileceğiniz birçok midwares var sadece dokümanı okuyun: http://expressjs.com/en/guide/using-middleware.html


2

app.use, belirtilen ara katman yazılımını ana uygulama ara katman yığınına uygular. Ana uygulama yığınına ara katman yazılımı eklerken, ekin sırası önemlidir; ara katman yazılımı B'den önce ara katman yazılımı A eklerseniz, önce ara katman yazılımı A yürütülür. Belirli bir ara katman yazılımının uygulanabileceği bir yol belirleyebilirsiniz. Aşağıdaki örnekte, “merhaba dünya” her zaman “mutlu tatiller” den önce kaydedilecektir.

const express = require('express')
const app = express()

app.use(function(req, res, next) {
  console.log('hello world')
  next()
})

app.use(function(req, res, next) {
  console.log('happy holidays')
  next()
})

2

Size (herhangi bir ara katman kullanmanızı sağlar devamı gibi) body_parser, CORSvb Katman değişiklik yapabilir requestve responsenesneleri. Ayrıca bir kod parçası yürütebilir.


Cevabınız için teşekkürler, ancak tüm bu bilgilerin diğer cevaplarda zaten ele geçirildiğine inanıyorum
Alexander Bird

2

Ayrıca kendi ara katman yazılım işlevinizi de oluşturabilirsiniz.

app.use( function(req, res, next) {
  // your code 
  next();
})

Bu üç parametre içeren req, res, next
Ayrıca temiz Denetleyicinizi tutmak için kimlik doğrulama ve giriş params doğrulama için kullanabilirsiniz.

next()sonraki ara katman yazılımına veya rotaya gitmek için kullanılır.
Cevabı ara yazılımdan gönderebilirsiniz


1

Uygulama düzeyinde ara katman yazılımını app.use () ve app.METHOD () işlevlerini kullanarak uygulama nesnesinin bir örneğine bağlayın; burada METHOD, ara katman yazılımı işlevinin (GET, PUT veya POST) küçük harf.


1

Kısacası app.use () tüm istek türlerini destekler [örneğin: get, post, ...] bu yüzden çoğunlukla yazılımın kurulumunda kullanılır. veya yollar ve fonksiyonlar ayrıldığında kullanılabilir

misal:

app.use("/test",functionName)

ve functionName farklı bir dosyada bulunuyor


Cevabınız için teşekkürler, ancak tüm bilgilerin zaten diğer cevaplarda yakalandığına inanıyorum.
Alexander Bird

1

app.use() bir ara katman yazılımı yöntemidir.

Ara katman yazılımı yöntemi java'da bir önleme gibidir, bu yöntem her zaman tüm istek için yürütülür.

Ara katmanın amacı ve kullanımı: -

  1. Oturumun süresinin dolup dolmadığını kontrol etmek için
  2. kullanıcı kimlik doğrulaması ve yetkilendirme için
  3. çerezleri kontrol et (son kullanma tarihi)
  4. yanıttan önce verileri ayrıştır

Middleware, app.use () öğesine aktarılan işlevdir.
NattyC

1

app.use
, express (nodejs ara katman yazılımı çerçevesi) tarafından oluşturulur
app.use, intisidasyon işleminde herhangi bir sorguyu yürütmek için kullanılır
server.js (node)
var app = requir ('express'); temelde app.use işlevi sunucu her açıldığında çağrılır
app.use(bodyparser.json())


0

app.use Uygulama düzeyinde ara katman yazılımıdır

Uygulama düzeyinde ara katman yazılımını app.use () ve app.METHOD () işlevlerini kullanarak uygulama nesnesinin bir örneğine bağlayın; burada METHOD, ara katman yazılımı işlevinin (GET, PUT veya POST) küçük harf.

örneğin tüm istekleri kontrol etmek için kullanabilirsiniz, örneğin, istekte belirteci kontrol etmek için app.use kullanarak bir ara katman yazılımı yazmanız gereken belirteç / erişim belirtecini kontrol etmek istiyorsunuz.

Bu örnekte, bağlama yolu olmayan bir ara katman yazılımı işlevi gösterilmektedir. İşlev, uygulama her istek aldığında yürütülür.

var app = express()

app.use(function (req, res, next) {
  console.log('Time:', Date.now())
  next()
})

https://expressjs.com/tr/guide/using-middleware.html adresinden referans


app.use () ara katman yazılımı değildir. Middleware app.use ()
NattyC

0

app.use (yol, ara katman yazılımı) , ilgili yol için rotaya çarpılmadan önce çağrılması gereken ara katman yazılımı işlevini çağırmak için kullanılır. Birden fazla ara katman yazılımı işlevi bir app.use aracılığıyla çağrılabilir.

app.use ('/ fetch', enforceAuthentication) -> enforceAuthentication ara katman yazılımı fn, '/ fetch' ile başlayan bir istek alındığında çağrılır. / Fetch / users , / fetch / ids / {id} vb.Olabilir.

İstekten bağımsız olarak bazı ara katman yazılımı işlevlerinin çağrılması gerekebilir. Bu gibi durumlarda, bir yol belirtilmez ve yol varsayılan değer olarak / ve her istek / ile başladığı için , bu ara katman işlevi tüm isteklerde çağrılır.

app.use (() => {// Ortak bir hizmeti başlat})

app.use öğesine birden fazla ara katman yazılımı işlevi iletildiğinde her ara katman yazılımı işlevi içinde next () fn çağrılması gerekir , , aksi takdirde bir sonraki ara katman yazılımı işlevi çağrılmaz.

başvuru: http://expressjs.com/en/api.html#app.use

Not: dokümanlar arayarak biz cari biri aşağıdaki katman fonksiyonları baypas can diyor ( 'rota') sonraki mevcut orta fonksiyonu içinde, ancak bu teknik app.use içinde benim için iş vermedi ama app.METHOD ile çalışma yaptı aşağıda gibi . Böylece fn1 ve fn2 çağrıldı ancak fn3 çağrılmadı.

app.get('/fetch', function fn1(req, res, next)  {
    console.log("First middleware function called"); 
        next();
    }, 
    function fn2(req, res, next) {
        console.log("Second middleware function called"); 
        next("route");
    }, 
    function fn3(req, res, next) {
        console.log("Third middleware function will not be called"); 
        next();
    })
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.