Skip to main content

Validation

NodeJS Validation - Joi

Slide PPT : https://docs.google.com/presentation/d/1-OR7TuDYvEIdo2RUVOfITxheICVapDnp

Validasi di NodeJS

  • NodeJS sayangnya tidak menyediakan package untuk validasi, oleh karena itu kita perlu melakukan validasi secara manual
  • Tapi untungnya, banyak package yang dibuat oleh komunitas programmer NodeJS yang bisa kita gunakan untuk mempermudah kita melakukan validasi
  • Salah satu library yang populer untuk melakukan validasi adalah library Joi

Install Joi

npm install Joi

Validation

Setelah menginstall Joi, hal pertama yang perlu kita lakukan untuk melakukan validasi adalah membuat Schema Schema adalah aturan-aturan yang sudah kita tentukan.

Setelah membuat schema, baru selanjutnya kita bisa melakukan validasi data menggunakan schema tersebut.

Basic validation

import Joi from "Joi";

const emailSchema = Joi.string().email().required();
const isAdminSchema = Joi.boolean().required();
const priceSchema = Joi.number().required().min(1000).max(100000);

const resultEmail = emailSchema.validate("joko@gmail.com");
const resultIsAdmin = isAdminSchema.validate("true"); // otomatis akan d konversi oleh joi
const resultPrice = priceSchema.validate("10000"); // otomatis akan d konversi oleh joi

Date Validation

const birthDateSchema = Joi.date().required().max("now").min("1-1-2000");

const result1 = birthDateSchema.validate("1-1-1999");
const result2 = birthDateSchema.validate("1-1-2008");
const result3 = birthDateSchema.validate("1-1-2026");

Validation Result

  • Saat kita melakukan validasi menggunakan method validate(), hasil dari method tersebut adalah object yang memiliki attribute value dan error
  • Hasil data akan ada di attribute value, contohnya misal kita validasi Date namun inputnya berupa String, maka secara otomatis value Date yang akan di konversi ke result.value
  • Namun jika terjadi error, secara otomatis result.error nya berisi ValidationError

Validation Error

Detail : https://joi.dev/api/?v=17.9.1#validationerror

const usernameSchema = Joi.string().min(5).email().required();

const result = usernameSchema.validate("ups", { abortEarly: false });

if (result.error) {
result.error.details.forEach((detail) => {
console.info(`${detail.path} - ${detail.message}`);
});
}

Validation Option

Saat kita melakukan validasi menggunakan validate() method, sebenarnya terdapat opsi tambahan yang bisa kita kirim untuk mengatur cara melakukan validasi

Detail : https://joi.dev/api/?v=17.9.1#anyvalidatevalue-options

// default ->  error akan ditampilkan satu saja
// abortEarly -> untuk menampilkan seluruh error
const result = usernameSchema.validate("ups", { abortEarly: false });

Object Validation

  • Saat kita membuat aplikasi, kita sering sekali membuat JavaScript Object
  • Untungnya Joi juga bisa digunakan untuk melakukan validasi JS Object, sehingga mempermudah kita untuk melakukan sekaligus ke semua field di JS Object

Detail : https://joi.dev/api/?v=17.9.1#object

const createUserSchema = Joi.object({
email: Joi.string().min(2).email().required(),
password: Joi.string().min(6).max(12).required(),
});

const user = {
email: "test@gmail.com",
password: "qwerty123",
};

const result = createUserSchema.validate(user, { abortEarly: false });

if (result.error) {
result.error.details.forEach((detail) => {
console.log(`${detail.path} - ${detail.message}`);
});
} else {
console.log(result);
}

Nested Object

Joi juga bisa digunakan untuk memvalidasi nested object, saat kita ingin memvalidasi nested object, kita harus tentung object schema nya juga

const createUserSchema = Joi.object({
email: Joi.string().min(2).email().required(),
password: Joi.string().min(6).max(12).required(),
address: Joi.object({
street: Joi.string().min(1).max(100).required(),
city: Joi.string().min(1).max(100).required(),
}).required(),
});

const address = {
email: "joko@gmail.com",
password: "qwerty123",
address: {
street: "jalan nangka",
city: "pekanbaru",
},
};

const result = createUserSchema.validate(address, { abortEarly: false });

if (result.error) {
result.error.details.forEach((detail) => {
console.log(`${detail.path} - ${detail.message}`);
});
} else {
console.log(result);
}

Array Validation

  • Selain Object, kita juga bisa melakukan validasi di data Array
  • Baik itu array dengan isi data sederhana, atau array dengan isi data object

Detail : https://joi.dev/api/?v=17.9.1#array

Array Tunggal

const createArraySchema = Joi.array().items(Joi.string().min(1).required()).min(1).unique();

const array = ["A", "coding", "coding"];

const result = createArraySchema.validate(array, { abortEarly: false });

Array of Object

Untuk melakukan validasi Array of Object, kita bisa kombinasikan schema array dan schema object

const createArraySchema = Joi.array()
.items(
Joi.object({
email: Joi.string().email().required(),
password: Joi.string().min(1).required(),
})
)
.min(1)
.unique();

const array = [
{
email: "joko",
password: "qwerty123",
},
];

const result = createArraySchema.validate(array, { abortEarly: false });

Custom Validation Message

  • Saat kita menggunakan validation milik Joi, terdapat default error message yang direpresentasikan menggunakan message key
  • Kita bisa lihat semua message key dan value nya di disini :
  • Jika kita mau, kita bisa mengubah value dari message key, ketika membuat schema, sehingga secara otomatis
  • Untuk menggubah message nya, kita bisa menggunakan method messages() pada schema
const schema = Joi.string().min(2).max(10).required().messages({
"any.required": "{{#label}} harus diisi",
"string.min": "{{#label}} harus minimal {{#limit}} karakter",
"string.max": "{{#label}} harus maksimal {{#limit}} karakter",
});

// costom object
const schema = Joi.object({
email: Joi.string().email().required().messages({
"any.required": "{{#label}} harus diisi",
"string.email": "{{#label}} harus email",
}),
password: Joi.string().min(6).max(10).required().messages({
"any.required": "{{#label}} harus diisi",
"string.min": "{{#label}} harus minimal {{#limit}} karakter",
"string.max": "{{#label}} harus maksimal {{#limit}} karakter",
}),
});

Custom Validation

  • Saat kita membutuhkan validasi yang tidak disediakan di Joi, kita juga bisa buat custom validation di Joi
  • Terdapat method custom() di semua Schema yang bisa kita gunakan untuk menambah validasi baru

Detail : https://joi.dev/api/?v=17.9.1#anycustommethod-description

const paswordConfirmSchema = Joi.object({
password: Joi.string()
.required()
.min(6)
.max(12)
.custom((value, helper) => {
if (value.startsWith("joko")) {
return helper.error("password.wrong");
}
return value;
})
.messages({
"password.wrong": "password tidak boleh dimulai dengan kalimat joko",
}),
confirmPassword: Joi.string().required().min(6).max(12),
})
.custom((value, helper) => {
if (value.password !== value.confirmPassword) {
return helper.error("register.password.different");
}
return value;
})
.message({
"register.password.different": "password harus sama",
});

const register = {
password: "test123",
confirmPassword: "test123",
};

const result = paswordConfirmSchema.validate(register, { abortEarly: false });