NodeJS / Express: apa itu "app.use"?


332

Dalam dokumen untuk expressmodul NodeJS , kode contoh memiliki app.use(...).

Apa usefungsi dan di mana itu didefinisikan?



Jenis pertanyaan ini dapat dijawab dengan membaca dokumentasi.
Mina

47
dokumentasinya agak samar untuk pemula
KansaiRobot

6
Kemungkinan rangkap di atas merujuk satu sama lain
Afrig Aminuddin

1
Dokumentasinya benar-benar tidak jelas
Tessaracter

Jawaban:


370

Objek aplikasi dipakai pada pembuatan server Express. Ini memiliki tumpukan middleware yang dapat dikustomisasi app.configure()(ini sekarang ditinggalkan dalam versi 4.x) .

Untuk mengatur middleware Anda, Anda dapat meminta app.use(<specific_middleware_layer_here>)untuk setiap lapisan middleware yang ingin Anda tambahkan (itu bisa generik untuk semua jalur, atau dipicu hanya pada jalur tertentu yang ditangani server Anda), dan itu akan ditambahkan ke tumpukan middleware Express Anda . Lapisan Middleware dapat ditambahkan satu per satu dalam beberapa pemanggilan use, atau bahkan sekaligus dalam satu seri dengan satu pemanggilan. Lihat usedokumentasi untuk lebih jelasnya.

Untuk memberikan contoh untuk pemahaman konseptual tentang Middleware Express, berikut adalah tampilan tumpukan aplikasi middleware (app.stack) saya saat masuk ke objek aplikasi saya ke konsol sebagai JSON:

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] } ]

Seperti yang mungkin Anda dapat menyimpulkan, aku menelepon app.use(express.bodyParser()), app.use(express.cookieParser()), dll, yang ditambahkan tersebut mengungkapkan middleware 'lapisan' ke stack middleware. Perhatikan bahwa rutenya kosong, artinya ketika saya menambahkan lapisan middleware saya tentukan bahwa mereka dipicu pada rute apa pun. Jika saya menambahkan lapisan middleware kustom yang hanya dipicu pada jalur /user/:idyang akan tercermin sebagai string di routebidang objek lapisan middleware dalam cetakan tumpukan di atas.

Setiap lapisan pada dasarnya menambahkan fungsi yang secara khusus menangani sesuatu ke aliran Anda melalui middleware.

Misalnya dengan menambahkan bodyParser, Anda memastikan server Anda menangani permintaan masuk melalui middleware ekspres . Jadi, sekarang mem-parsing badan permintaan masuk adalah bagian dari prosedur yang dilakukan middleware Anda saat menangani permintaan masuk - semua karena Anda menelepon app.use(bodyParser).


116
Terima kasih. apakah akan sangat sulit bagi orang-orang ekspres untuk menjelaskan hal ini dalam dokumen API mereka?
ericsoco

4
Jadi Anda mengatakan bahwa ketika permintaan diterima, data dilewatkan melalui parser-parser tersebut sebelum mengenai layanan yang sebenarnya. Jadi misalnya: Permintaan Valid-> Otentikasi-> ProcessesRequest-> ServResponse USE akan mengontrol langkah-langkah tersebut dalam urutan tertentu dan tidak menjalankannya secara paralel?
Adam Hess

2
Jadi apakah injeksi ketergantungan app.use () beraksi?
Kevin C.

8
Kapan fungsi yang dikirim ke app.use dipanggil? Setelah membuat server ekspres atau untuk setiap permintaan?
Timo Huovinen

5
@KevinC. Tidak, ini bukan injeksi ketergantungan. Ini adalah arsitektur plugin. Umumnya arsitektur semacam ini disebut sistem filter / filter pipeline / pipa dan filter. Dalam Express, pipanya adalah next()callback yang diharapkan setiap middleware untuk memanggil untuk melewati pemrosesan ke fungsi berikutnya dalam pipeline. Sistem perutean (argumen pertama ke app.use()) memungkinkan pipa untuk bercabang tergantung pada URL
slebetman

50

useadalah metode untuk mengonfigurasi middleware yang digunakan oleh rute dari objek server HTTP Express. Metode ini didefinisikan sebagai bagian dari Connect yang didasarkan pada Express.

Pembaruan Dimulai dengan versi 4.x, Express tidak lagi tergantung pada Connect .

Fungsi middleware yang sebelumnya disertakan dengan Express sekarang dalam modul terpisah; lihat daftar fungsi middleware .


3
Dan dokumen daring ada di sini: senchalabs.org/connect/proto.html#app.use
Alexander Bird

Apakah akan efisien jika Node middleware instantiate objek? Apakah ini berarti bahwa pada setiap permintaan, middleware yang instantiate objek baru? Apakah benda-benda lama dibuang? Misalnyaapp.use(function(){ var object = new SomeConstructor; next(); })
CMCDragonkai

1
@ CMCDragonkai Tidak apa-apa untuk instantiate objek pada setiap permintaan. Mereka akan mengumpulkan sampah selama Anda tidak menyimpan referensi ke objek di luar lingkup penangan permintaan Anda.
jeff_mcmahan

1
@AlexanderBird thx untuk tautan (yang ke-1 rusak sekarang). Sebagai catatan, awal dokumen di tautan ke-2 mengatakan "Gunakan pegangan middleware yang diberikan untuk rute yang diberikan, default ke /." Rute "ini adalah titik-mount untuk middleware, ketika diberi nilai selain dari / middleware hanya efektif ketika segmen itu hadir di pathname permintaan. Misalnya jika kita ingin me-mount fungsi di / admin, itu akan dipanggil pada / admin, dan / admin / pengaturan, namun itu tidak akan dipanggil untuk / , atau / posting ". Sederhana :)
Adrien Jadilah

40

Setiap app.use (middleware) dipanggil setiap kali permintaan dikirim ke server.


7
Jawaban satu kalimat Anda dapat dimengerti secara langsung dan lebih bermanfaat daripada penjelasan multi-paragraf lainnya.
DitumpukAndOverflowed

16

app.use () digunakan untuk me-mount fungsi middleware atau me-mount ke jalur yang ditentukan, fungsi middleware dijalankan ketika jalur dasar cocok.

Misalnya: jika Anda menggunakan app.use () di indexRouter.js, seperti ini:

//indexRouter.js

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

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

Dalam kode di atas app.use () pasang path di '/ ads' ke adsRouter.js.

Sekarang di adsRouter.js

// adsRouter.js

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

di adsRouter.js, path akan seperti ini untuk ads- '/ ads / show', dan kemudian akan bekerja sesuai dengan controllerIndex.ads.showAd ().

app.use ([path], callback, [callback]): kita bisa menambahkan callback yang sama.

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

  // write your callback code here.

    });

Saya akan menggunakan "peta" di tempat "mount", lebih mudah dimengerti.
Jeb50

13

app.use () bertindak sebagai middleware di aplikasi ekspres. Tidak seperti app.get () dan app.post () atau lebih, Anda sebenarnya dapat menggunakan app.use () tanpa menentukan URL permintaan. Dalam kasus seperti apa yang dilakukannya, itu dieksekusi setiap kali tidak peduli URL apa yang dipukul.


7

app.use () berfungsi seperti itu:

  1. Permintaan acara dipicu pada instance server http node.
  2. express melakukan beberapa manipulasi batiniahnya dengan objek req.
  3. Ini adalah ketika express mulai melakukan hal-hal yang Anda tentukan dengan app.use

yang sangat sederhana.

Dan hanya dengan demikian express akan melakukan hal-hal lain seperti routing.


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

app.use adalah cara untuk mendaftarkan middleware atau rantai middlewares (atau beberapa middlewares) sebelum menjalankan logika rute akhir atau logika rute perantara tergantung pada urutan urutan pendaftaran middleware.

Middleware: membentuk rangkaian fungsi / middleware-fungsi dengan 3 parameter req, res, dan selanjutnya . selanjutnya adalah panggilan balik yang merujuk pada fungsi middleware berikutnya dalam rantai dan dalam kasus fungsi middleware terakhir dari rantai berikutnya menunjuk ke fungsi middleware pertama dari rantai middlerare berikutnya yang terdaftar.


1
Bekerja seperti pesona !!
Anmol Rai

3

Di express jika kita mengimpor express dari "express" dan menggunakan app = express (); maka aplikasi memiliki semua fungsi express

jika kita menggunakan app.use ()

dengan fungsi modul / middleware untuk digunakan dalam keseluruhan proyek kilat


3

app.useadalah fungsi membutuhkan middleware. Sebagai contoh:

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

Contoh ini menunjukkan fungsi middleware yang dipasang di /user/:idpath. Fungsi ini dijalankan untuk semua jenis permintaan HTTP di/user/:id jalur.

Ini mirip dengan REST Web Server, cukup gunakan berbeda /xxuntuk mewakili tindakan yang berbeda.


terima kasih atas jawabannya, tetapi karena orang lain sudah mengatakan semua informasi itu, saya tidak akan mengungguli yang ini. Saya rasa saya tidak perlu penjelasan apa pun yang usebisa dilakukan oleh ekspres ; Saya hanya perlu tahu apa itu (dan pengetahuan konteks apa pun untuk mengetahui cara melakukan penelitian lebih lanjut sendiri).
Alexander Bird

3

app.use adalah wajan sebagai middleware untuk permintaan aplikasi. sintaksis

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

contoh

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

Anda juga dapat menggunakannya jika merutekan permintaan Anda.

app.use('/', roting_object);

2

Middleware adalah istilah umum untuk perangkat lunak yang berfungsi untuk "menyatukan" sehingga app.use adalah metode untuk mengonfigurasi middleware, misalnya: untuk mengurai dan menangani isi permintaan: app.use (bodyParser.urlencoded ({extended: true })); app.use (bodyParser.json ()); ada banyak middlewares yang dapat Anda gunakan dalam aplikasi kilat Anda cukup membaca dokumen: http://expressjs.com/en/guide/using-middleware.html


2

app.use menerapkan middleware yang ditentukan untuk tumpukan middleware aplikasi utama. Saat melampirkan middleware ke tumpukan aplikasi utama, urutan lampiran penting; jika Anda melampirkan middleware A sebelum middleware B, middleware A akan selalu mengeksekusi terlebih dahulu. Anda dapat menentukan jalur yang berlaku middleware tertentu. Dalam contoh di bawah ini, "halo dunia" akan selalu dicatat sebelum "liburan bahagia."

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

Ini memungkinkan Anda untuk menggunakan middleware ( baca selengkapnya ) seperti body_parser, CORSdll. Middleware dapat membuat perubahan requestdan responseobjek. Itu juga dapat mengeksekusi sepotong kode.


Terima kasih atas jawabannya, tetapi saya yakin semua informasi itu sudah ditangkap dalam jawaban lain
Alexander Bird

2

Anda juga dapat membuat fungsi middleware sendiri seperti

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

Ini berisi tiga parameter req , res, next
Anda juga dapat menggunakannya untuk otentikasi dan validasi params masukan untuk menjaga controller bersih.

next()digunakan untuk menuju ke middleware atau rute berikutnya.
Anda dapat mengirim respons dari middleware


1

Ikat middleware tingkat aplikasi ke instance objek aplikasi dengan menggunakan fungsi app.use () dan app.METHOD (), di mana METHOD adalah metode HTTP dari permintaan yang ditangani oleh fungsi middleware (seperti GET, PUT, atau POST) dalam huruf kecil.


1

Singkatnya app.use () mendukung semua jenis permintaan [mis .: get, post, ...] sehingga sebagian besar digunakan untuk mengatur middelware. atau dapat digunakan untuk saat rute dan fungsi dipisahkan

contoh:

app.use("/test",functionName)

dan functionName terletak di file yang berbeda


Terima kasih atas jawabannya, tetapi saya yakin semua informasi itu sudah ditangkap dalam jawaban lain.
Alexander Bird

1

app.use() adalah metode middleware.

Metode Middleware seperti pencegat di java, metode ini selalu dijalankan untuk semua permintaan.

Tujuan dan penggunaan middleware: -

  1. Untuk memeriksa apakah sesi berakhir atau tidak
  2. untuk otentikasi dan otorisasi pengguna
  3. periksa cookie (tanggal kedaluwarsa)
  4. parsing data sebelum respons

Middleware adalah fungsi yang dilewatkan ke app.use ().
NattyC

1

app.use
dibuat oleh express (nodejs middleware framework)
app.use digunakan untuk mengeksekusi permintaan spesifik di proses
intilisasi server.js (node)
var app = membutuhkan ('express'); jadi pada dasarnya fungsi app.use dipanggil setiap kali server naik
app.use(bodyparser.json())


0

app.use adalah middleware tingkat Aplikasi

Ikat middleware tingkat aplikasi ke instance objek aplikasi dengan menggunakan fungsi app.use () dan app.METHOD (), di mana METHOD adalah metode HTTP dari permintaan yang ditangani oleh fungsi middleware (seperti GET, PUT, atau POST) dalam huruf kecil.

Anda dapat menggunakan untuk memeriksa semua permintaan, misalnya, Anda ingin memeriksa token / akses token Anda perlu menulis middleware dengan menggunakan aplikasi. gunakan untuk memeriksa token dalam permintaan.

Contoh ini menunjukkan fungsi middleware tanpa jalur mount. Fungsi ini dijalankan setiap kali aplikasi menerima permintaan.

var app = express()

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

referensi dari https://expressjs.com/en/guide/using-middleware.html


app.use () bukan middleware. Middleware adalah fungsi yang dilewatkan ke app.use ()
NattyC

0

app.use (path, middleware) digunakan untuk memanggil fungsi middleware yang perlu dipanggil sebelum rute dipukul untuk jalur yang sesuai. Beberapa fungsi middleware dapat dipanggil melalui app.use.

app.use ('/ fetch', menegakkanAuthentication) -> menegakkanAuthentication middleware fn akan dipanggil ketika permintaan dimulai dengan '/ fetch' diterima. Itu bisa / fetch / pengguna , / fetch / id / {id} , dll

Beberapa fungsi middleware mungkin harus disebut terlepas dari permintaan tersebut. Untuk kasus seperti itu, jalur tidak ditentukan, dan karena jalur default ke / dan setiap permintaan dimulai dengan / , fungsi middleware ini akan dipanggil untuk semua permintaan.

app.use (() => {// Menginisialisasi layanan umum})

next () fn perlu dipanggil dalam setiap fungsi middleware ketika beberapa fungsi middleware dilewatkan ke app.use , kalau tidak fungsi middleware berikutnya tidak akan dipanggil.

referensi: http://expressjs.com/en/api.html#app.use

Catatan: Dokumentasi mengatakan kita dapat mem-bypass fungsi middleware mengikuti yang sekarang dengan memanggil next ('route') dalam fungsi middleware saat ini, tetapi teknik ini tidak bekerja untuk saya di dalam app.use tetapi bekerja dengan app.METHOD seperti di bawah ini . Jadi, fn1 dan fn2 dipanggil tetapi bukan fn3.

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();
    })
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.