出于某种不可描述的需求,需要在服务端校验上传的文件类型和大小,由于之前没接触过node,就开始了愉快的踩坑之旅。
坑一:request.on()事件不执行
因为接收到了request请求,首先希望通过request的on事件监听data事件,达到统计数据大小的目,先看代码:
router.post("/upload", async (req, res) => {
logger.info("Request Comming In", req.files.length);
req.on('data', (chunk) => {
dataSize += chunk.length;
logger.info("${chunk.length} bytes of data comming in, ${dataSize} bytes has received");
});
req.on("end", () => {
logger.info("${dataSize} bytes data received in total");
res.sendStatus(200);
});
});
然而测试发现,以上on事件完全没有执行,菜鸟表示不懂,欢迎大佬指教;
坑二:formidable.on()事件不执行
后来又百度到了formidable,于是就寄希望于它,当然,依旧踩坑了:
router.post("/upload", async (req, res) => {
logger.info("Request Comming In", req.files.length);
var form = new formidable.IncomingForm();
form.on('file', (field, file) => {
// xxxx
});
form.on("field", (field, value) => {
// xxxx
});
});
真的想不通,难不成这些事件被监听之前没有emit?菜鸟不懂,也不敢问,但记得formidable还有的个parse方法,再来一试。
坑三:formidable.parse()事件无数据
router.post("/upload", async (req, res) => {
var form = new formidable.IncomingForm();
form.parse(req, function (err, fields, files) {
if (err) res.sendStatus(500);
logger.info("fields:\n", JSON.stringify(fields));
logger.info("files:\n", JSON.stringify(files));
}
});
无奈,通过打印的日志发现,fields和files全是空的,我太难了。。。此处附上formidable的简单介绍:
https://www.cnblogs.com/Trr-984688199/p/6285958.html?utm_source=itdadao&utm_medium=referral
可是问题依旧是要解决的呀!
灵光一闪解决之道:request.files
我突然想到,之前通过JSON.stringify打印request的时候报错了,但同样的方法打印request.body是可以的,要是request里面存在file这样的字段了呢?随便一试,果然有request.files!打印,其结构如下
[{"fieldname":"my_file_name","originalname":"wo-tai-nan-le.jpg","encoding":"7bit","mimetype":"image/jpeg","buffer":{"type":"Buffer","data":[255,216,255....]}}]
参考files的数据结构,解决问题就不难了。
网友评论