Membuat aplikasi Gemini AI Chatbot
Membuat aplikasi Gemini AI Chatbot:
Bisa kamu bantu saya membuat aplikasi semacam AI Chatbot. Bantu perbaiki file index.json ini agar program berjalan dengan baik bisa meng-generate from image di bagian kode app.post
Saya akan membantu memperbaiki file index.js Anda. Ada beberapa kesalahan sintaks dan logika yang perlu diperbaiki. Berikut adalah versi yang sudah dikoreksi:
```javascript
// import dependencies
import express from 'express';
import dotenv from 'dotenv';
import cors from 'cors';
import multer from 'multer';
import fs from 'fs';
import path from 'path';
import { GoogleGenAI } from '@google/genai';
// Setup aplikasi
dotenv.config();
console.log("API Key Loaded:", process.env.GOOGLE_GEMINI_API_KEY);
// Inisialisasi Express.js
const app = express();
// Middleware
app.use(express.json());
app.use(cors());
// Inisialisasi Google Gemini AI
const genAI = new GoogleGenAI({
apiKey: process.env.GOOGLE_GEMINI_API_KEY
});
// Konfigurasi Multer untuk upload file
const upload = multer({
dest: "uploads/"
});
// Endpoint untuk generate text
app.post("/generate-text", async (req, res) => {
const { prompt } = req.body;
try {
const result = await genAI.models.generateContent({
model: "gemini-2.0-flash",
contents: prompt
});
res.json({
output: result.text
});
} catch (e) {
console.error(e);
res.status(500).json({
error: e.message
});
}
});
// Endpoint untuk generate dari gambar
app.post("/generate-from-image", upload.single("image"), async (req, res) => {
const { prompt = "Describe this uploaded image" } = req.body;
try {
// Upload gambar ke Google AI
const image = await genAI.files.upload({
file: req.file.path,
config: {
mimeType: req.file.mimetype
}
});
// Generate konten dari gambar
const result = await genAI.models.generateContent({
model: "gemini-2.0-flash",
contents: [
{
role: "user",
parts: [
{ text: prompt },
{
fileData: {
mimeType: image.mimeType,
fileUri: image.uri
}
}
]
}
]
});
res.json({ output: result.text });
} catch (error) {
console.error("Error generating content:", error);
res.status(500).json({ error: error.message });
} finally {
// Hapus file temporary
if (req.file) {
fs.unlinkSync(req.file.path);
}
}
});
// Jalankan server
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
});
```
Perbaikan utama yang dilakukan:
1. Syntax Errors:
· Menghapus titik koma berlebihan di import dotenv
· Memperbaiki struktur objek dan kurung
· Memperbaiki penulisan console.log dan console.error
2. Google AI Integration:
· Memperbaiki format request untuk generate content dari gambar
· Menggunakan struktur parts yang benar untuk menggabungkan teks dan gambar
3. Multer Configuration:
· Memperbaiki middleware upload file
· Menambahkan error handling untuk file operations
4. General Improvements:
· Menambahkan CORS middleware
· Menambahkan server startup
· Memperbaiki formatting dan konsistensi kode
5. Error Handling:
· Menambahkan check untuk req.file di blok finally
· Memperbaiki struktur try-catch
Pastikan Anda:
1. Memiliki file .env dengan GOOGLE_GEMINI_API_KEY yang valid
2. Membuat folder uploads di root project
3. Menginstall semua dependencies yang diperlukan:
```bash
npm install express dotenv cors multer @google/genai
```
Untuk testing, Anda bisa menggunakan Postman atau curl dengan:
· Text Endpoint: POST ke /generate-text dengan body JSON {"prompt": "Your question here"}
· Image Endpoint: POST ke /generate-from-image dengan form-data yang berisi:
· image (file)
· prompt (optional, text field)
pada file index.js tersebut, tambahkan fitur :
- generate-from-document dengan menambahkan app.post agar bisa mengupload file dokumen.
- generate-from-audio dengan menambahkan app.post agar bisa mengupload file audio
Saya akan menambahkan fitur untuk mengupload file dokumen dan audio. Berikut adalah file index.js yang sudah diperbaiki dan ditambahkan dengan kedua fitur tersebut:
```javascript
// import dependencies
import express from 'express';
import dotenv from 'dotenv';
import cors from 'cors';
import multer from 'multer';
import fs from 'fs';
import path from 'path';
import { GoogleGenAI } from '@google/genai';
// Setup aplikasi
dotenv.config();
console.log("API Key Loaded:", process.env.GOOGLE_GEMINI_API_KEY);
// Inisialisasi Express.js
const app = express();
// Middleware
app.use(express.json());
app.use(cors());
// Inisialisasi Google Gemini AI
const genAI = new GoogleGenAI({
apiKey: process.env.GOOGLE_GEMINI_API_KEY
});
// Konfigurasi Multer untuk upload file
const upload = multer({
dest: "uploads/",
limits: {
fileSize: 10 * 1024 * 1024, // 10MB limit
}
});
// Helper function untuk mendapatkan ekstensi file
const getFileExtension = (filename) => {
return path.extname(filename).toLowerCase();
};
// Endpoint untuk generate text
app.post("/generate-text", async (req, res) => {
const { prompt } = req.body;
if (!prompt) {
return res.status(400).json({ error: "Prompt is required" });
}
try {
const result = await genAI.models.generateContent({
model: "gemini-2.0-flash",
contents: prompt
});
res.json({
output: result.text
});
} catch (e) {
console.error(e);
res.status(500).json({
error: e.message
});
}
});
// Endpoint untuk generate dari gambar
app.post("/generate-from-image", upload.single("image"), async (req, res) => {
const { prompt = "Describe this uploaded image" } = req.body;
if (!req.file) {
return res.status(400).json({ error: "Image file is required" });
}
try {
// Upload gambar ke Google AI
const image = await genAI.files.upload({
file: req.file.path,
config: {
mimeType: req.file.mimetype
}
});
// Generate konten dari gambar
const result = await genAI.models.generateContent({
model: "gemini-2.0-flash",
contents: [
{
role: "user",
parts: [
{ text: prompt },
{
fileData: {
mimeType: image.mimeType,
fileUri: image.uri
}
}
]
}
]
});
res.json({ output: result.text });
} catch (error) {
console.error("Error generating content from image:", error);
res.status(500).json({ error: error.message });
} finally {
// Hapus file temporary
if (req.file && fs.existsSync(req.file.path)) {
fs.unlinkSync(req.file.path);
}
}
});
// Endpoint untuk generate dari dokumen
app.post("/generate-from-document", upload.single("document"), async (req, res) => {
const { prompt = "Analyze this document" } = req.body;
if (!req.file) {
return res.status(400).json({ error: "Document file is required" });
}
// Supported document types
const supportedDocs = ['.pdf', '.txt', '.doc', '.docx', '.ppt', '.pptx'];
const fileExt = getFileExtension(req.file.originalname);
if (!supportedDocs.includes(fileExt)) {
return res.status(400).json({
error: "Unsupported document type. Supported: PDF, TXT, DOC, DOCX, PPT, PPTX"
});
}
try {
// Upload dokumen ke Google AI
const document = await genAI.files.upload({
file: req.file.path,
config: {
mimeType: req.file.mimetype
}
});
// Generate konten dari dokumen
const result = await genAI.models.generateContent({
model: "gemini-2.0-flash",
contents: [
{
role: "user",
parts: [
{ text: prompt },
{
fileData: {
mimeType: document.mimeType,
fileUri: document.uri
}
}
]
}
]
});
res.json({
output: result.text,
documentType: fileExt,
fileName: req.file.originalname
});
} catch (error) {
console.error("Error generating content from document:", error);
res.status(500).json({ error: error.message });
} finally {
// Hapus file temporary
if (req.file && fs.existsSync(req.file.path)) {
fs.unlinkSync(req.file.path);
}
}
});
// Endpoint untuk generate dari audio
app.post("/generate-from-audio", upload.single("audio"), async (req, res) => {
const { prompt = "Transcribe and analyze this audio" } = req.body;
if (!req.file) {
return res.status(400).json({ error: "Audio file is required" });
}
// Supported audio types
const supportedAudio = ['.mp3', '.wav', '.m4a', '.flac', '.ogg'];
const fileExt = getFileExtension(req.file.originalname);
if (!supportedAudio.includes(fileExt)) {
return res.status(400).json({
error: "Unsupported audio type. Supported: MP3, WAV, M4A, FLAC, OGG"
});
}
try {
// Upload audio ke Google AI
const audio = await genAI.files.upload({
file: req.file.path,
config: {
mimeType: req.file.mimetype
}
});
// Generate konten dari audio
const result = await genAI.models.generateContent({
model: "gemini-2.0-flash",
contents: [
{
role: "user",
parts: [
{ text: prompt },
{
fileData: {
mimeType: audio.mimeType,
fileUri: audio.uri
}
}
]
}
]
});
res.json({
output: result.text,
audioType: fileExt,
fileName: req.file.originalname
});
} catch (error) {
console.error("Error generating content from audio:", error);
res.status(500).json({ error: error.message });
} finally {
// Hapus file temporary
if (req.file && fs.existsSync(req.file.path)) {
fs.unlinkSync(req.file.path);
}
}
});
// Health check endpoint
app.get("/", (req, res) => {
res.json({
message: "Gemini AI Chatbot API is running",
endpoints: {
text: "POST /generate-text",
image: "POST /generate-from-image",
document: "POST /generate-from-document",
audio: "POST /generate-from-audio"
}
});
});
// Jalankan server
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
console.log(`Uploads directory: ${path.resolve("uploads/")}`);
// Pastikan folder uploads exists
if (!fs.existsSync("uploads")) {
fs.mkdirSync("uploads");
console.log("Created uploads directory");
}
});
```
Fitur yang Ditambahkan:
1. Generate dari Dokumen (/generate-from-document)
· Mendukung format: PDF, TXT, DOC, DOCX, PPT, PPTX
· Validasi tipe file
· Response termasuk tipe dokumen dan nama file
2. Generate dari Audio (/generate-from-audio)
· Mendukung format: MP3, WAV, M4A, FLAC, OGG
· Validasi tipe file
· Response termasuk tipe audio dan nama file
Perbaikan dan Enhancement:
1. Validasi Input: Menambahkan validasi untuk file yang diupload
2. Error Handling: Improved error handling dengan status code yang tepat
3. File Type Checking: Validasi ekstensi file yang didukung
4. Health Check: Endpoint root untuk mengecek status API
5. Auto-create Uploads: Membuat folder uploads otomatis jika belum ada
6. File Size Limit: Membatasi ukuran file hingga 10MB
7. Better Responses: Response yang lebih informatif
Cara Menggunakan:
Untuk Dokumen:
```bash
curl -X POST http://localhost:3000/generate-from-document \
-F "document=@/path/to/your/file.pdf" \
-F "prompt=Summarize this document"
```
Untuk Audio:
```bash
curl -X POST http://localhost:3000/generate-from-audio \
-F "audio=@/path/to/your/audio.mp3" \
-F "prompt=Transcribe this audio"
```
Pastikan Anda telah menginstall dependencies yang diperlukan:
```bash
npm install express dotenv cors multer @google/genai
```
Dan memiliki file .env dengan:```
GOOGLE_GEMINI_API_KEY=your_google_gemini_api_key_here
```
untuk kepastian dukungan file lain, bantu perbaiki kode pada file package.json, dan package-lock.json ini
Berdasarkan package.json dan package-lock.json Anda, saya akan memperbaiki dan mengoptimalkan file package.json untuk mendukung fitur-fitur yang telah ditambahkan. Berikut adalah package.json yang sudah diperbaiki:
```json
{
"name": "gemini-ai-chatbot",
"version": "1.0.0",
"description": "Gemini AI Chatbot with text, image, document, and audio processing capabilities",
"main": "index.js",
"type": "module",
"scripts": {
"start": "node index.js",
"dev": "node --watch index.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [
"gemini-ai",
"chatbot",
"express",
"multer",
"file-upload"
],
"author": "Your Name",
"license": "MIT",
"dependencies": {
"@google/genai": "^1.25.0",
"cors": "^2.8.5",
"dotenv": "^17.2.3",
"express": "^5.1.0",
"multer": "^2.0.2"
},
"engines": {
"node": ">=18.0.0"
}
}
```
Perbaikan yang dilakukan:
1. Nama dan Deskripsi
· Mengubah nama menjadi lebih deskriptif: gemini-ai-chatbot
· Menambahkan deskripsi yang jelas tentang fungsi aplikasi
2. Scripts
· Menambahkan start untuk production
· Menambahkan dev dengan --watch flag (tersedia di Node.js 18+)
· Menghapus devDependencies untuk menyederhanakan
3. Metadata
· Menambahkan keywords yang relevan
· Mengubah license ke MIT (lebih umum untuk proyek open source)
· Menambahkan author information
4. Engine Requirements
· Menetapkan requirement Node.js >= 18.0.0 untuk kompatibilitas dengan @google/genai
Untuk package-lock.json
Tidak perlu mengubah package-lock.json secara manual. File ini akan otomatis terupdate ketika Anda menjalankan:
```bash
npm install
```
Setelah memperbarui package.json, jalankan perintah berikut:
```bash
# Hapus node_modules dan package-lock.json lama (opsional)
rm -rf node_modules package-lock.json
# Install ulang semua dependencies
npm install
```
File .env Example
Buat juga file .env di root project Anda:
```env
GOOGLE_GEMINI_API_KEY=your_actual_gemini_api_key_here
PORT=3000
```
Testing Script
Anda bisa menambahkan script testing untuk memverifikasi endpoint (opsional):
```json
"scripts": {
"start": "node index.js",
"dev": "node --watch index.js",
"test:endpoints": "curl -X GET http://localhost:3000/",
"test:text": "curl -X POST http://localhost:3000/generate-text -H \"Content-Type: application/json\" -d '{\"prompt\":\"Hello, how are you?\"}'"
}
```
Dengan konfigurasi ini, aplikasi Anda akan:
· ✅ Mendukung semua fitur (text, image, document, audio)
· ✅ Kompatibel dengan Google GenAI SDK
· ✅ Siap untuk deployment
· ✅ Memiliki struktur project yang lebih profesional
Jalankan aplikasi dengan:
```bash
npm run dev # Untuk development
# atau
npm start # Untuk production
```
Bantu buatkan kode isi file .gitignore, dan file README.md
Berikut adalah file .gitignore dan README.md untuk project Gemini AI Chatbot Anda:
File: .gitignore
```gitignore
# Dependencies
node_modules/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# Environment variables
.env
.env.local
.env.development.local
.env.test.local
.env.production.local
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
.pnpm-debug.log*
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# Coverage directory used by tools like istanbul
coverage/
*.lcov
# nyc test coverage
.nyc_output
# Dependency directories
node_modules/
jspm_packages/
# Optional npm cache directory
.npm
# Optional eslint cache
.eslintcache
# Microbundle cache
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variables file
.env
.env.test
# parcel-bundler cache (https://parceljs.org/)
.cache
.parcel-cache
# Next.js build output
.next
# Nuxt.js build / generate output
.nuxt
dist
# Gatsby files
.cache/
public
# Vuepress build output
.vuepress/dist
# Serverless directories
.serverless/
# FuseBox cache
.fusebox/
# DynamoDB Local files
.dynamodb/
# TernJS port file
.tern-port
# Stores VSCode versions used for testing VSCode extensions
.vscode-test
# Uploads directory (temporary files)
uploads/*
!uploads/.gitkeep
# IDE files
.vscode/
.idea/
*.swp
*.swo
*~
# OS generated files
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db
# Temporary folders
tmp/
temp/
```
File: README.md
```markdown
# Gemini AI Chatbot API
A powerful Express.js API that integrates with Google Gemini AI to provide text generation, image analysis, document processing, and audio transcription capabilities.
## 🚀 Features
- **Text Generation**: Generate AI-powered text responses
- **Image Analysis**: Upload and analyze images with AI
- **Document Processing**: Process various document formats (PDF, TXT, DOC, DOCX, PPT, PPTX)
- **Audio Transcription**: Transcribe and analyze audio files (MP3, WAV, M4A, FLAC, OGG)
- **RESTful API**: Clean and simple API endpoints
- **File Upload Support**: Multipart form data support via Multer
## 📋 Prerequisites
- Node.js >= 18.0.0
- Google Gemini AI API Key
- npm or yarn
## 🛠 Installation
1. **Clone the repository**
```bash
git clone <your-repo-url>
cd gemini-ai-chatbot
```
1. Install dependencies
```bash
npm install
```
2. Environment Configuration
Create a .env file in the root directory:
```env
GOOGLE_GEMINI_API_KEY=your_google_gemini_api_key_here
PORT=3000
```
3. Get Google Gemini API Key
· Visit Google AI Studio
· Create a new API key
· Add it to your .env file
🚀 Usage
Start the Server
Development mode (with auto-reload):
```bash
npm run dev
```
Production mode:
```bash
npm start
```
The server will start on http://localhost:3000 (or the port specified in your .env file).
📚 API Endpoints
1. Health Check
GET /
Check if the API is running.
```bash
curl http://localhost:3000/
```
2. Text Generation
POST /generate-text
Generate text using AI.
Request:
```bash
curl -X POST http://localhost:3000/generate-text \
-H "Content-Type: application/json" \
-d '{"prompt": "Explain quantum computing in simple terms"}'
```
Response:
```json
{
"output": "Quantum computing is a type of computation that harnesses quantum mechanical phenomena..."
}
```
3. Image Analysis
POST /generate-from-image
Analyze and describe uploaded images.
Request:
```bash
curl -X POST http://localhost:3000/generate-from-image \
-F "image=@/path/to/your/image.jpg" \
-F "prompt=Describe this image in detail"
```
Response:
```json
{
"output": "This image shows a beautiful sunset over mountains with vibrant orange and purple colors..."
}
```
4. Document Processing
POST /generate-from-document
Process and analyze document files.
Supported formats: PDF, TXT, DOC, DOCX, PPT, PPTX
Request:
```bash
curl -X POST http://localhost:3000/generate-from-document \
-F "document=@/path/to/your/file.pdf" \
-F "prompt=Summarize this document"
```
Response:
```json
{
"output": "This document discusses...",
"documentType": ".pdf",
"fileName": "file.pdf"
}
```
5. Audio Transcription
POST /generate-from-audio
Transcribe and analyze audio files.
Supported formats: MP3, WAV, M4A, FLAC, OGG
Request:
```bash
curl -X POST http://localhost:3000/generate-from-audio \
-F "audio=@/path/to/your/audio.mp3" \
-F "prompt=Transcribe this audio"
```
Response:
```json
{
"output": "Hello, this is a transcription of the audio...",
"audioType": ".mp3",
"fileName": "audio.mp3"
}
```
🔧 Configuration
Environment Variables
Variable Description Default
GOOGLE_GEMINI_API_KEY Your Google Gemini AI API key Required
PORT Server port 3000
File Upload Limits
· Maximum file size: 10MB per upload
· Supported image formats: JPEG, PNG, GIF, WEBP
· Supported document formats: PDF, TXT, DOC, DOCX, PPT, PPTX
· Supported audio formats: MP3, WAV, M4A, FLAC, OGG
🗂 Project Structure
```
gemini-ai-chatbot/
├── index.js # Main application file
├── package.json # Dependencies and scripts
├── .env # Environment variables (create this)
├── .gitignore # Git ignore rules
├── uploads/ # Temporary file storage
│ └── .gitkeep # Keep folder in git
└── README.md # This file
```
🛠 Development
Scripts
· npm start - Start production server
· npm run dev - Start development server with auto-reload
· npm test - Run tests (to be implemented)
Adding New Features
1. Create new endpoint in index.js
2. Add validation for file types if needed
3. Update error handling
4. Update this README with new endpoint documentation
🤝 Contributing
1. Fork the repository
2. Create a feature branch (git checkout -b feature/amazing-feature)
3. Commit your changes (git commit -m 'Add some amazing feature')
4. Push to the branch (git push origin feature/amazing-feature)
5. Open a Pull Request
📝 License
This project is licensed under the MIT License - see the LICENSE file for details.
⚠️ Troubleshooting
Common Issues
1. API Key Error: Ensure your GOOGLE_GEMINI_API_KEY is set correctly in the .env file
2. Port Already in Use: Change the PORT in your .env file
3. File Upload Fails: Check file size (max 10MB) and format
4. Module Not Found: Run npm install to install dependencies
Getting Help
· Check the Google Gemini AI documentation
· Review the Express.js docs
· Check issues in the GitHub repository
🙏 Acknowledgments
· Google Gemini AI for the powerful AI capabilities
· Express.js for the web framework
· Multer for file upload handling
```
## File: `uploads/.gitkeep` (buat folder uploads)
Buat folder `uploads` dan di dalamnya buat file `.gitkeep` (file kosong) untuk menjaga folder tersebut tetap ada di Git:
```bash
mkdir uploads
touch uploads/.gitkeep
```
File .gitkeep ini kosong, tujuannya hanya agar Git tetap melacak folder uploads meskipun kosong.
Dengan file-file ini, project Anda sekarang memiliki:
· ✅ Konfigurasi Git yang tepat
· ✅ Dokumentasi yang komprehensif
· ✅ Struktur project yang profesional
· ✅ Petunjuk penggunaan yang jelas
Project siap untuk digunakan dan dikembangkan lebih lanjut!
disamping file .env, , apakah harus ikut juga file .env.example
Ya, sangat disarankan untuk menyertakan file .env.example dalam repository. File ini berfungsi sebagai template untuk konfigurasi environment variables tanpa mengekspos data sensitif.
File: .env.example
```env
# Google Gemini AI Configuration
# Get your API key from: https://makersuite.google.com/app/apikey
GOOGLE_GEMINI_API_KEY=your_google_gemini_api_key_here
# Server Configuration
PORT=3000
# Optional: Additional Configuration
# NODE_ENV=development
# CORS_ORIGIN=http://localhost:3000
# MAX_FILE_SIZE=10485760
```
File: .env (untuk development lokal Anda)
```env
GOOGLE_GEMINI_API_KEY=your_actual_gemini_api_key_here
PORT=3000
```
Manfaat memiliki .env.example:
1. Template untuk Developer Baru: Developer lain bisa copy file ini dan membuat .env mereka sendiri
2. Dokumentasi Variabel: Menunjukkan semua environment variables yang diperlukan
3. Keamanan: Tidak ada data sensitif yang ter-expose di repository
4. Konsistensi: Memastikan semua environment variables konsisten di berbagai environment
Update .gitignore
Tambahkan pengecualian untuk .env.example di .gitignore:
```gitignore
# Environment variables
.env
.env.local
.env.development.local
.env.test.local
.env.production.local
# But keep the example file
!.env.example
```
Cara penggunaan untuk developer baru:
```bash
# 1. Clone repository
git clone <repository-url>
cd gemini-ai-chatbot
# 2. Copy environment template
cp .env.example .env
# 3. Edit .env dengan nilai sebenarnya
# Edit file .env dan isi GOOGLE_GEMINI_API_KEY dengan API key Anda
# 4. Install dan jalankan
npm install
npm run dev
```
Optional: Advanced .env.example
Jika Anda ingin menambahkan konfigurasi tambahan, bisa menggunakan versi yang lebih lengkap:
```env
# ====================================
# Gemini AI Chatbot - Environment Configuration
# ====================================
# REQUIRED: Google Gemini AI Configuration
# Get your API key from: https://makersuite.google.com/app/apikey
GOOGLE_GEMINI_API_KEY=your_google_gemini_api_key_here
# REQUIRED: Server Configuration
PORT=3000
# OPTIONAL: Environment Mode
# Options: development, production, test
NODE_ENV=development
# OPTIONAL: CORS Configuration
# CORS_ORIGIN=http://localhost:3000,http://localhost:5173
# OPTIONAL: File Upload Limits (in bytes)
# MAX_FILE_SIZE=10485760
# OPTIONAL: Logging Level
# LOG_LEVEL=info
# ====================================
# Development Notes:
# 1. Copy this file to .env
# 2. Fill in your actual values
# 3. Never commit .env to version control
# ====================================
```
Dengan memiliki .env.example, project Anda menjadi lebih profesional dan mudah untuk di-setup oleh developer lain.
Bersambung Ke: MENGUPLOAD SEMUA FILE APLIKASI KE REPOSITORY GITHUB
Comments
Post a Comment