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 keresult.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 });