Tutorial Nuxt 3 dan Laravel 10 #4 : Insert dan Upload Data Dengan Rest API di Nuxt 3


Tutorial Nuxt 3 dan Laravel 10 #4 : Insert dan Upload Data Dengan Rest API di Nuxt 3

Halo teman-teman semuanya, pada artikel sebelumnya kita telah belajar bagaimana cara menampilkan data di dalam Nuxt 3 menggunakan Rest API. Dan pada artikel kali ini kita semua akan belajar bagaimana cara melakukan proses insert dan upload gambar di dalam Nuxt 3 menggunakan Rest API.

Langkah 1 - Membuat Page Create Post

Silahkan teman-teman jalankan perintah berikut ini di dalam terminal/CMD dan pastikan sudah berada di dalam project Nuxt 3.

npx nuxi add page "posts/create/index"

Jika perintah di atas berhasil dijalankan, maka kita akan mendapatkan folder baru dengan nama create di dalam folder pages/posts dan di dalam folder create tersebut kita mendapatkan file baru dengan nama index.vue.

Silahkan buka file tersebut, yaitu pages/posts/create/index.vue, kemudian ubah semua kode-nya menjadi seperti berikut ini.

<script setup lang="ts">

    //meta title
    useHead({
        title: 'Create a Post - SantriKoding.com',
    });

    //init config
    const config = useRuntimeConfig();  

    //init router
    const router = useRouter();

    //define state
    const image     = ref('');
    const title     = ref('');
    const content   = ref('');
    const errors  : any  = ref({});

    //method for handle file changes
    const handleFileChange = ( e: any ) => {

        //assign file to state 
        image.value = e.target.files[0]
    }

    //method "storePost"
    const storePost = async () => {
        
        //init formData
        let formData = new FormData();

        //assign state value to formData
        formData.append('image', image.value);
        formData.append('title', title.value);
        formData.append('content', content.value);

        //store data with API
        await $fetch(`${config.public.apiBase}/api/posts`, {

            //method
            method: 'POST',

            //data
            body: formData
        })
        .then(() => {
            //redirect
            router.push({ path: "/posts" });
        })
        .catch((error) => {

            //assign response error data to state "errors"
            errors.value = error.data
        });
    }

</script>

<template>
    <div class="container mt-5">
        <div class="row">
            <div class="col-md-12">
                <div class="card border-0 rounded shadow">
                    <div class="card-body">
                        <form @submit.prevent="storePost()">
                            <div class="mb-3">
                                <label class="form-label fw-bold">Image</label>
                                <input type="file" class="form-control" @change="handleFileChange($event)">
                                <div v-if="errors.image" class="alert alert-danger mt-2">
                                    <span>{{ errors.image[0] }}</span>
                                </div>
                            </div>
                            <div class="mb-3">
                                <label class="form-label fw-bold">Title</label>
                                <input type="text" class="form-control" v-model="title" placeholder="Title Post">
                                <div v-if="errors.title" class="alert alert-danger mt-2">
                                    <span>{{ errors.title[0] }}</span>
                                </div>
                            </div>
                            <div class="mb-3">
                                <label class="form-label fw-bold">Content</label>
                                <textarea class="form-control" v-model="content" rows="5" placeholder="Content Post"></textarea>
                                <div v-if="errors.content" class="alert alert-danger mt-2">
                                    <span>{{ errors.content[0] }}</span>
                                </div>
                            </div>
                            <button type="submit" class="btn btn-md btn-primary rounded-sm shadow border-0">Save</button>
                        </form>
                    </div>
                </div>
            </div>
        </div>
    </div>
</template>

Dari perubahan kode di atas, pertama kita konfigurasi meta title untuk halaman ini menggunakan useHead dari Nuxt 3.

//meta title
useHead({
    title: 'Create a Post - SantriKoding.com',
});

Karena kita akan memanggil apiBase yang ada di dalam nuxt config, maka kita perlu melakukan inisialisasi.

//init config
const config = useRuntimeConfig();  

Setelah itu, kita inisialisasi router, ini akan kita gunakan untuk navigasi atau berpindah halaman setelah proses insert data berhasil dilakukan.

//init router
const router = useRouter();

Kemudian kita membuat beberapa state yang nanti digunakan untuk menampung data yang dimasukkan di dalam input form.

//define state
const image     = ref('');
const title     = ref('');
const content   = ref('');
const errors  : any  = ref({});

Selanjutnya kita membuat method yang bernama handleFileChange. Method ini yang bertugas untuk melakukan assign value file / gambar ke dalam state image. Dan method ini akan dijlankan ketika input file diubah isinya.

<input type="file" class="form-control" @change="handleFileChange($event)">
//method for handle file changes
const handleFileChange = ( e: any ) => {

    //assign file to state 
    image.value = e.target.files[0] 
}

Di atas, kita melakukan assign value target file ke dalam state image.

Terakhir, kita membuat method baru yang bernama storePost. Method ini nanti yang bertugas melakukan proses insert data dan upload gambar menggunakan Rest API ke server. Dan method ini akan dijalankan ketika form disubmit.

<form @submit.prevent="storePost()">

	//...
	
</form>
//method "storePost"
const storePost = async () => {

	//...
	
}

Di dalam method di atas, pertama kita akan inisialisasi FormData terlebih dahulu. Ini digunakan karena kita akan mengirimkan file ke dalam server / backend.

//init formData
let formData = new FormData();

Setelah itu, kita append atau memasukkan data ke dalam formData yang mana data-nya diambil dari state.

//assign state value to formData
formData.append('image', image.value);
formData.append('title', title.value);
formData.append('content', content.value);

Selanjutnya, kita tinggal mengirimkan formData di atas ke server / backend menggunakan fetch dengan method POST.

//store data with API
await $fetch(`${config.public.apiBase}/api/posts`, {

    //method
    method: 'POST',

    //data
    body: formData
})

Jika proses insert dan upload gambar berhasil dilakukan, maka akan masuk ke dalam promise then dan di dalamnya kita lakukan redirect ke halaman /posts.

.then(() => {
    //redirect
    router.push({ path: "/posts" });
})

Tapi, jika data gagal disimpan, maka akan masuk ke dalam promise catch dan di dalamnya kita melakukan assign response data error ke dalam state errors.

.catch((error) => {

    //assign response error data to state "errors"
    errors.value = error.data
});

Untuk menampilkan error pada template, kita bisa menggunakan pengkondisian v-if, kurang lebih seperti berikut ini.

<div v-if="errors.image" class="alert alert-danger mt-2">
    <span>{{ errors.image[0] }}</span>
</div>

Langkah 2 - Uji Coba Insert Data Post

Sekarang silahkan teman-teman klik button ADD NEW POST yang ada pada halaman posts index atau bisa langsung ke URL berikut ini http://localhost:3000/posts/create. Jika berhasil maka akan menampilkan halaman seperti berikut ini.

Silahkan klik button Save tanpa mengisi data apapun, maka kita akan mendapatkan error validasi yang kurang lebih seperti berikut ini.

Terakhir, silahkan masukkan data yang ada di dalam input form dan klik Save, jika berhasil maka data akan diinsert ke dalam database dan kita diarahkan pada halaman posts index.

Kurang lebih seperti itu tutorial bagaimana cara melakukan proses insert dan upload di dalam Nuxt 3 menggunakan Rest API.

Pada artikel berikutnya kita akan belajar bagaimana cara melakukan proses edit dan update di dalam Nuxt 3 menggunakan Rest API.

Terima Kasih



Fika Ridaul Maulayya
Full-Stack Developer, Content Creator and CO-Founder SantriKoding.com

Suka dengan tulisan di SantriKoding? Kamu bisa memberikan dukungan dengan berdonasi atau bagikan konten ini di sosial media. Terima kasih atas dukungan Anda!

KEBIJAKAN KOMENTAR

Saat memberikan komenatar silahkan memberikan informasi lengkap tentang error, seperti: screenshot, link kode, dll. Baca aturan komentar kami