中间件 body-parser 原理分析(手写bodyParse)),前端开发提升
body-parser
是一个Express.js中间件,用于解析请求体。以下是一个简化版的 body-parser
中间件实现:
const { IncomingForm } = require('formidable');
function parseJson(req) {
return new Promise((resolve, reject) => {
let data = '';
req.on('data', chunk => {
data += chunk;
});
req.on('end', () => {
try {
const parsedData = JSON.parse(data);
resolve(parsedData);
} catch (error) {
reject(error);
}
});
});
}
function parseUrlEncoded(req) {
return new Promise((resolve, reject) => {
let data = '';
req.on('data', chunk => {
data += chunk;
});
req.on('end', () => {
resolve(qs.parse(data));
});
});
}
function multipartMiddleware(req, res, next) {
if (req.headers['content-type'] && req.headers['content-type'].startsWith('multipart/form-data')) {
const form = new IncomingForm();
form.parse(req, (err, fields, files) => {
if (err) {
next(err);
return;
}
req.body = { ...fields, ...files };
next();
});
} else {
next();
}
}
function bodyParser(req, res, next) {
if (req.headers['content-type'] && req.headers['content-type'].startsWith('application/json')) {
parseJson(req)
.then(body => {
req.body = body;
next();
})
.catch(next);
} else if (req.headers['content-type'] && req.headers['content-type'].startsWith('application/x-www-form-urlencoded')) {
parseUrlEncoded(req)
.then(body => {
req.body = body;
next();
})
.catch(next);
} else {
multipartMiddleware(req, res, next);
}
}
module.exports = bodyParser;
这个实现包括了处理JSON、URL编码的表单数据以及multipart/form-data类型的请求体。它首先检查请求头的Content-Type
来决定使用哪种解析方式,然后根据选择的解析方式读取请求体数据,并在解析完成后将结果设置到req.body
属性上,最后调用next()
继续执行后续的中间件或路由处理。
评论已关闭