Create MinIO Bucket using Express.js

Create MinIO Bucket using Express.js

Source: Dev.to

1️⃣ Install Dependencies ## 2️⃣ Project Structure (Recommended) ## 3️⃣ .env Configuration ## 4️⃣ MinIO Client (src/minio/minioClient.js) ## 5️⃣ Bucket Service (src/services/bucket.service.js) ## 6️⃣ Bucket API Route (src/routes/bucket.routes.js) ## 7️⃣ Express App (src/app.js) ## 8️⃣ Run the Application ## 9️⃣ Test with CURL or Insomnia ## Request ## Success Response ## Already Exists ## 🔐 Permissions Reminder The MinIO user must have: Otherwise you'll get AccessDenied. Github: https://github.com/codefalconx/minio-service Reference: https://www.min.io/ Templates let you quickly answer FAQs or store snippets for re-use. Are you sure you want to hide this comment? It will become hidden in your post, but will still be visible via the comment's permalink. Hide child comments as well For further actions, you may consider blocking this person and/or reporting abuse COMMAND_BLOCK: npm init -y npm install express minio dotenv Enter fullscreen mode Exit fullscreen mode COMMAND_BLOCK: npm init -y npm install express minio dotenv COMMAND_BLOCK: npm init -y npm install express minio dotenv CODE_BLOCK: minio-service/ ├── src/ │ ├── app.js │ ├── minio/ │ │ └── minioClient.js │ ├── routes/ │ │ └── bucket.routes.js │ └── services/ │ └── bucket.service.js ├── .env └── package.json Enter fullscreen mode Exit fullscreen mode CODE_BLOCK: minio-service/ ├── src/ │ ├── app.js │ ├── minio/ │ │ └── minioClient.js │ ├── routes/ │ │ └── bucket.routes.js │ └── services/ │ └── bucket.service.js ├── .env └── package.json CODE_BLOCK: minio-service/ ├── src/ │ ├── app.js │ ├── minio/ │ │ └── minioClient.js │ ├── routes/ │ │ └── bucket.routes.js │ └── services/ │ └── bucket.service.js ├── .env └── package.json CODE_BLOCK: PORT=3000 MINIO_ENDPOINT=localhost MINIO_PORT=9000 MINIO_USE_SSL=false MINIO_ACCESS_KEY=minioadmin MINIO_SECRET_KEY=minioadmin Enter fullscreen mode Exit fullscreen mode CODE_BLOCK: PORT=3000 MINIO_ENDPOINT=localhost MINIO_PORT=9000 MINIO_USE_SSL=false MINIO_ACCESS_KEY=minioadmin MINIO_SECRET_KEY=minioadmin CODE_BLOCK: PORT=3000 MINIO_ENDPOINT=localhost MINIO_PORT=9000 MINIO_USE_SSL=false MINIO_ACCESS_KEY=minioadmin MINIO_SECRET_KEY=minioadmin CODE_BLOCK: import { Client } from 'minio'; import dotenv from 'dotenv'; dotenv.config(); const minioClient = new Client({ endPoint: process.env.MINIO_ENDPOINT, port: parseInt(process.env.MINIO_PORT), useSSL: process.env.MINIO_USE_SSL === 'true', accessKey: process.env.MINIO_ACCESS_KEY, secretKey: process.env.MINIO_SECRET_KEY, }); export default minioClient; Enter fullscreen mode Exit fullscreen mode CODE_BLOCK: import { Client } from 'minio'; import dotenv from 'dotenv'; dotenv.config(); const minioClient = new Client({ endPoint: process.env.MINIO_ENDPOINT, port: parseInt(process.env.MINIO_PORT), useSSL: process.env.MINIO_USE_SSL === 'true', accessKey: process.env.MINIO_ACCESS_KEY, secretKey: process.env.MINIO_SECRET_KEY, }); export default minioClient; CODE_BLOCK: import { Client } from 'minio'; import dotenv from 'dotenv'; dotenv.config(); const minioClient = new Client({ endPoint: process.env.MINIO_ENDPOINT, port: parseInt(process.env.MINIO_PORT), useSSL: process.env.MINIO_USE_SSL === 'true', accessKey: process.env.MINIO_ACCESS_KEY, secretKey: process.env.MINIO_SECRET_KEY, }); export default minioClient; CODE_BLOCK: import minioClient from '../minio/minioClient.js'; export async function createBucket(bucketName) { const exists = await minioClient.bucketExists(bucketName); if (exists) { return { created: false, message: 'Bucket already exists' }; } await minioClient.makeBucket(bucketName); return { created: true, message: 'Bucket created successfully' }; } Enter fullscreen mode Exit fullscreen mode CODE_BLOCK: import minioClient from '../minio/minioClient.js'; export async function createBucket(bucketName) { const exists = await minioClient.bucketExists(bucketName); if (exists) { return { created: false, message: 'Bucket already exists' }; } await minioClient.makeBucket(bucketName); return { created: true, message: 'Bucket created successfully' }; } CODE_BLOCK: import minioClient from '../minio/minioClient.js'; export async function createBucket(bucketName) { const exists = await minioClient.bucketExists(bucketName); if (exists) { return { created: false, message: 'Bucket already exists' }; } await minioClient.makeBucket(bucketName); return { created: true, message: 'Bucket created successfully' }; } COMMAND_BLOCK: import express from 'express'; import { createBucket } from '../services/bucket.service.js'; const router = express.Router(); /** * POST /api/buckets * Body: { "bucketName": "my-new-bucket" } */ router.post('/', async (req, res) => { try { const { bucketName } = req.body; if (!bucketName) { return res.status(400).json({ message: 'bucketName is required' }); } const result = await createBucket(bucketName); return res.status(200).json(result); } catch (err) { console.error(err); return res.status(500).json({ message: 'Failed to create bucket', error: err.message, }); } }); export default router; Enter fullscreen mode Exit fullscreen mode COMMAND_BLOCK: import express from 'express'; import { createBucket } from '../services/bucket.service.js'; const router = express.Router(); /** * POST /api/buckets * Body: { "bucketName": "my-new-bucket" } */ router.post('/', async (req, res) => { try { const { bucketName } = req.body; if (!bucketName) { return res.status(400).json({ message: 'bucketName is required' }); } const result = await createBucket(bucketName); return res.status(200).json(result); } catch (err) { console.error(err); return res.status(500).json({ message: 'Failed to create bucket', error: err.message, }); } }); export default router; COMMAND_BLOCK: import express from 'express'; import { createBucket } from '../services/bucket.service.js'; const router = express.Router(); /** * POST /api/buckets * Body: { "bucketName": "my-new-bucket" } */ router.post('/', async (req, res) => { try { const { bucketName } = req.body; if (!bucketName) { return res.status(400).json({ message: 'bucketName is required' }); } const result = await createBucket(bucketName); return res.status(200).json(result); } catch (err) { console.error(err); return res.status(500).json({ message: 'Failed to create bucket', error: err.message, }); } }); export default router; COMMAND_BLOCK: import express from 'express'; import bucketRoutes from './routes/bucket.routes.js'; const app = express(); app.use(express.json()); app.use('/api/buckets', bucketRoutes); const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(`MinIO service running on port ${PORT}`); }); Enter fullscreen mode Exit fullscreen mode COMMAND_BLOCK: import express from 'express'; import bucketRoutes from './routes/bucket.routes.js'; const app = express(); app.use(express.json()); app.use('/api/buckets', bucketRoutes); const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(`MinIO service running on port ${PORT}`); }); COMMAND_BLOCK: import express from 'express'; import bucketRoutes from './routes/bucket.routes.js'; const app = express(); app.use(express.json()); app.use('/api/buckets', bucketRoutes); const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(`MinIO service running on port ${PORT}`); }); CODE_BLOCK: node src/app.js Enter fullscreen mode Exit fullscreen mode CODE_BLOCK: node src/app.js CODE_BLOCK: node src/app.js COMMAND_BLOCK: curl -X POST http://localhost:3000/api/buckets \ -H "Content-Type: application/json" \ -d '{ "bucketName": "test-bucket-001" }' Enter fullscreen mode Exit fullscreen mode COMMAND_BLOCK: curl -X POST http://localhost:3000/api/buckets \ -H "Content-Type: application/json" \ -d '{ "bucketName": "test-bucket-001" }' COMMAND_BLOCK: curl -X POST http://localhost:3000/api/buckets \ -H "Content-Type: application/json" \ -d '{ "bucketName": "test-bucket-001" }' CODE_BLOCK: { "created": true, "message": "Bucket created successfully" } Enter fullscreen mode Exit fullscreen mode CODE_BLOCK: { "created": true, "message": "Bucket created successfully" } CODE_BLOCK: { "created": true, "message": "Bucket created successfully" } CODE_BLOCK: { "created": false, "message": "Bucket already exists" } Enter fullscreen mode Exit fullscreen mode CODE_BLOCK: { "created": false, "message": "Bucket already exists" } CODE_BLOCK: { "created": false, "message": "Bucket already exists" } CODE_BLOCK: "s3:CreateBucket", "s3:ListAllMyBuckets" Enter fullscreen mode Exit fullscreen mode CODE_BLOCK: "s3:CreateBucket", "s3:ListAllMyBuckets" CODE_BLOCK: "s3:CreateBucket", "s3:ListAllMyBuckets"