Validasi Input Joi Node.js: Panduan Implementasi Schema Validation

Implementasi Validasi Joi pada Node.js

Joi adalah pustaka validasi data berbasis skema yang paling banyak digunakan dalam ekosistem Node.js untuk memastikan input dari pengguna (seperti req.body, req.params, atau req.query) sesuai dengan format yang diharapkan sebelum diproses oleh logika bisnis. Dengan Joi, Anda dapat mendefinisikan aturan ketat seperti tipe data, panjang karakter, format email, hingga aturan kustom lainnya.

Langkah Instalasi dan Penggunaan Dasar

Untuk memulai, instal paket Joi melalui npm:

npm install joi

Berikut adalah contoh implementasi dasar untuk memvalidasi input registrasi pengguna:

const Joi = require('joi');

const schema = Joi.object({
  username: Joi.string().alphanum().min(3).max(30).required(),
  email: Joi.string().email().required(),
  age: Joi.number().integer().min(18).max(99)
});

const data = { username: 'azwinn', email: '[email protected]', age: 25 };
const { error, value } = schema.validate(data);

if (error) {
  console.log('Validasi Gagal:', error.details[0].message);
} else {
  console.log('Validasi Berhasil:', value);
}

Tabel Aturan Validasi Umum

Metode JoiDeskripsiContoh Penggunaan
string()Memastikan input bertipe stringJoi.string().min(5)
number()Memastikan input bertipe angkaJoi.number().integer()
email()Validasi format email standarJoi.string().email()
required()Field wajib diisiJoi.string().required()
alphanum()Hanya huruf dan angkaJoi.string().alphanum()
pattern()Validasi menggunakan RegexJoi.string().pattern(/^[a-zA-Z]+$/)

Integrasi dengan Express.js

Praktik terbaik dalam aplikasi Express.js adalah menggunakan middleware untuk memisahkan logika validasi dari controller. Ini menjaga kode tetap bersih dan modular.

const validateRequest = (schema) => {
  return (req, res, next) => {
    const { error } = schema.validate(req.body);
    if (error) {
      return res.status(400).json({ error: error.details[0].message });
    }
    next();
  };
};

// Penggunaan di route
app.post('/register', validateRequest(schema), (req, res) => {
  res.send('Data valid!');
});

Tips Troubleshooting

  • AbortEarly: Secara default, Joi berhenti pada error pertama. Gunakan { abortEarly: false } dalam opsi validasi untuk mendapatkan semua pesan error sekaligus.
  • Unknown Keys: Gunakan .unknown(false) untuk menolak input yang tidak didefinisikan dalam skema guna mencegah mass assignment vulnerability.
  • Sanitasi: Joi secara otomatis mengembalikan objek yang telah dibersihkan (misalnya menghapus spasi berlebih) melalui properti value hasil validasi.