Membuat Middleware Di Framework Express JS - CRUDPRO

Membuat Middleware Di Framework Express JS

Ringkasan

Fungction middleware adalah fungsi yang dapat mengakses fungsi-fungsi berikut di objek permintaan (req), objek respons (res), dan siklus permintaan/respons aplikasi. Fungsi berikut adalah fungsi router Express yang, ketika dipanggil, menjalankan middleware yang mengikuti middleware saat ini. Fungsi middleware dapat melakukan tugas-tugas berikut:

  • Jalankan kode apa pun.
  • Buat perubahan pada objek permintaan dan respons.
  • Mengakhiri siklus permintaan dan respons.
  • Memanggil middleware berikutnya dalam tumpukan/stack.

Jika fungsi middleware saat ini tidak mengakhiri siklus permintaan/respons, next() berikutnya harus dipanggil untuk meneruskan kontrol ke fungsi middleware berikutnya. Jika tidak, permintaan akan tetap digantung.

Gambar berikut menunjukkan elemen dari panggilan fungsi middleware:

Dimulai dengan Express 5, fungsi middleware yang mengembalikan Promises memanggil (value) berikutnya ketika mereka menolak atau melempar kesalahan. berikutnya dipanggil dengan nilai yang ditolak atau kesalahan yang dilemparkan.

contoh

Ini adalah contoh aplikasi Express "Hello World" sederhana. Di sisa artikel ini, kita akan mendefinisikan dan menambahkan tiga fungsi middleware ke aplikasi kita. Satu disebut myLogger, yang mengeluarkan pesan log sederhana, yang lain disebut requestTime, yang menampilkan stempel waktu permintaan HTTP, dan yang lainnya disebut validasiCookies, yang memvalidasi cookie yang masuk.

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

app.get('/', (req, res) => {
  res.send('Hello World!')
})

app.listen(3000)

Fungsi middleware myLogger

Ini adalah contoh sederhana dari fungsi middleware yang disebut "myLogger". Fungsi ini hanya mencetak "LOGGED" ketika permintaan ke aplikasi lewat. Fungsi middleware ditugaskan ke variabel bernama myLogger.

const myLogger = function (req, res, next) {
  console.log('LOGGED')
  next()
}

*Perhatikan panggilan ke next() di atas. Memanggil fungsi ini akan memanggil fungsi middleware berikutnya di aplikasi Anda. Fungsi next() bukan bagian dari Node.js atau Express API, tetapi merupakan argumen ketiga yang diteruskan ke fungsi middleware. Fungsi next() dapat diberi nama apa saja, tetapi menurut konvensi selalu diberi nama "berikutnya". Selalu gunakan aturan ini untuk menghindari kebingungan.

Untuk memuat fungsi middleware, panggil app.use() dengan fungsi middleware. Misalnya, kode berikut memuat fungsi middleware myLogger sebelum rute ke jalur root(/).

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

const myLogger = function (req, res, next) {
  console.log('LOGGED')
  next()
}

app.use(myLogger)

app.get('/', (req, res) => {
  res.send('Hello World!')
})

app.listen(3000)

Setiap kali aplikasi menerima permintaan, itu mencetak pesan "LOGGED" ke perangkat Anda. Urutan di mana middleware dimuat adalah penting. Fungsi middleware yang dimuat terlebih dahulu juga dieksekusi terlebih dahulu.

Jika myLogger dimuat setelah rute ke jalur root, pengendali jalur root akan mengakhiri siklus permintaan dan respons, sehingga permintaan tidak akan mencapai jalur root dan aplikasi tidak akan mencetak "LOGGED".

Fungsi middleware myLogger hanya mencetak pesan dan memanggil fungsi next() untuk meneruskan permintaan ke fungsi middleware berikutnya dalam tumpukan.

fungsi middleware requestTime

Selanjutnya, buat fungsi middleware yang disebut "requestTime" dan tambahkan properti bernama requestTime ke objek permintaan.

const requestTime = function (req, res, next) {
  req.requestTime = Date.now()
  next()
}

Aplikasi sekarang menggunakan fungsi middleware requestTime. Selain itu, fungsi callback root path root menggunakan properti yang ditambahkan oleh fungsi middleware ke req (objek permintaan).

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

const requestTime = function (req, res, next) {
  req.requestTime = Date.now()
  next()
}

app.use(requestTime)

app.get('/', (req, res) => {
  let responseText = 'Hello World!<br>'
  responseText += `<small>Requested at: ${req.requestTime}</small>`
  res.send(responseText)
})

app.listen(3000)

Saat Anda mengirimkan permintaan ke root aplikasi Anda, aplikasi sekarang menampilkan stempel waktu permintaan Anda di browser Anda.

Fungsi middleware memvalidasi Cookie

Terakhir, buat fungsi middleware yang memvalidasi cookie yang masuk dan mengirimkan 400 respons jika cookie tidak valid.

Ini adalah contoh fungsi yang memvalidasi cookie menggunakan layanan asinkron eksternal.

async function cookieValidator (cookies) {
  try {
    await externallyValidateCookie(cookies.testCookie)
  } catch {
    throw new Error('Invalid cookies')
  }
}

Di sini kita menggunakan middleware cookie-parser untuk mengurai cookie yang masuk dari objek req dan meneruskannya ke fungsi cookieValidator. middleware validasiCookies mengembalikan janji yang secara otomatis memicu penangan kesalahan jika ditolak.

const express = require('express')
const cookieParser = require('cookie-parser')
const cookieValidator = require('./cookieValidator')

const app = express()

async function validateCookies (req, res, next) {
  await cookieValidator(req.cookies)
  next()
}

app.use(cookieParser())

app.use(validateCookies)

// error handler
app.use((err, req, res, next) => {
  res.status(400).send(err.message)
})

app.listen(3000)

Perhatikan bagaimana next() dipanggil setelah menunggu cookieValidator (req.cookies). Ini memastikan bahwa jika cookieValidator diselesaikan, middleware berikutnya dalam tumpukan akan dipanggil. Jika Anda meneruskan sesuatu ke fungsi() berikutnya (kecuali untuk string'route'or'router'), Express menganggap permintaan saat ini sebagai kesalahan dan melewatkan sisa fungsi perutean dan middleware non-penanganan kesalahan.

Dengan akses ke objek permintaan, objek respons, fungsi middleware berikut di tumpukan, dan seluruh API Node.js, kemungkinan fungsi middleware tidak terbatas.

Untuk informasi lebih lanjut tentang Express Middleware, lihat Bekerja dengan Express Middleware.

Middleware yang dapat dikonfigurasi

Jika Anda perlu membuat middleware dapat dikonfigurasi, ekspor fungsi yang menerima objek opsional atau parameter lainnya. Ini akan mengembalikan implementasi middleware berdasarkan parameter input.

File: my-middleware.js
module.exports = function (options) {
  return function (req, res, next) {
    // Implement the middleware function based on the options object
    next()
  }
}
Middleware sekarang dapat digunakan sebagai berikut.
const mw = require('./my-middleware.js')

app.use(mw({ option1: '1', option2: '2' }))

Lihat Sesi Cookie dan Kompresi untuk contoh middleware yang dapat dikonfigurasi.