Introduction to Busboy
Busboy is a fast and robust module designed to parse incoming form data, especially file uploads, in Node.js applications. Built on top of the dicer
parser, its efficiency makes it an excellent choice for handling multipart form data.
Installing Busboy
First, you need to install the Busboy package:
npm install busboy
Using Busboy: Basic Example
Here’s a basic example showing how to use Busboy to handle file uploads:
const Busboy = require('busboy');
const http = require('http');
const fs = require('fs');
const path = require('path');
const server = http.createServer((req, res) => {
if (req.method === 'POST') {
const busboy = Busboy({ headers: req.headers });
busboy.on('file', (fieldname, file, filename, encoding, mimetype) => {
const saveTo = path.join(__dirname, 'uploads', path.basename(filename));
file.pipe(fs.createWriteStream(saveTo));
});
busboy.on('finish', () => {
res.writeHead(200, { 'Connection': 'close' });
res.end('File uploaded successfully');
});
req.pipe(busboy);
} else {
res.writeHead(404);
res.end();
}
});
server.listen(3000, () => {
console.log('Server is listening on port 3000');
});
Busboy API Methods
Busboy offers several useful methods for handling different aspects of file and form data uploads:
Busboy#Field
The field
event handles non-file fields in the form. Example:
busboy.on('field', (fieldname, val, fieldnameTruncated, valTruncated, encoding, mimetype) => {
console.log(`Field [${fieldname}]: value: %j`, val);
});
Busboy#File
The file
event handles file streams. Example:
busboy.on('file', (fieldname, file, filename, encoding, mimetype) => {
const saveTo = path.join(__dirname, 'uploads', path.basename(filename));
file.pipe(fs.createWriteStream(saveTo));
});
Busboy#PartsLimit
Limit the number of fields and files being parsed.
const busboy = new Busboy({
headers: req.headers,
limits: {
parts: 10, // Max number of parts (fields/files)
}
});
Busboy#FilesLimit
Limit the number of file fields being parsed.
const busboy = new Busboy({
headers: req.headers,
limits: {
files: 1, // Max number of file fields
}
});
Busboy#FieldsLimit
Limit the number of fields (excluding files) being parsed.
const busboy = new Busboy({
headers: req.headers,
limits: {
fields: 5, // Max number of non-file fields
}
});
Building an App with Busboy
Let’s create a basic app with the mentioned APIs. The app will handle file uploads and display form field data:
const express = require('express');
const Busboy = require('busboy');
const fs = require('fs');
const path = require('path');
const app = express();
app.post('/upload', (req, res) => {
const busboy = new Busboy({ headers: req.headers });
busboy.on('file', (fieldname, file, filename, encoding, mimetype) => {
const saveTo = path.join(__dirname, 'uploads', path.basename(filename));
file.pipe(fs.createWriteStream(saveTo));
});
busboy.on('field', (fieldname, val) => {
console.log(`Field [${fieldname}]: value: %j`, val);
});
busboy.on('finish', () => {
res.writeHead(200, { 'Connection': 'close' });
res.end('Upload complete');
});
req.pipe(busboy);
});
app.listen(3000, () => {
console.log('Server is listening on port 3000');
});
With this setup, the server will be able to handle file and field uploads gracefully while enforcing the specified limits.
Hash: 2a9af83d983d8dff397fefc03ef7cb874ecf6dd112b9c48e261c05105f224020