出于某種不可描述的需求嫉入,需要在服務(wù)端校驗上傳的文件類型和大小抄淑,由于之前沒接觸過node刻剥,就開始了愉快的踩坑之旅。
坑一:request.on()事件不執(zhí)行
因為接收到了request請求腻窒,首先希望通過request的on事件監(jiān)聽data事件昵宇,達(dá)到統(tǒng)計數(shù)據(jù)大小的目,先看代碼:
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);
});
});
然而測試發(fā)現(xiàn)儿子,以上on事件完全沒有執(zhí)行瓦哎,菜鳥表示不懂,歡迎大佬指教典徊;
坑二:formidable.on()事件不執(zhí)行
后來又百度到了formidable杭煎,于是就寄希望于它,當(dāng)然卒落,依舊踩坑了:
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
});
});
真的想不通羡铲,難不成這些事件被監(jiān)聽之前沒有emit?菜鳥不懂儡毕,也不敢問也切,但記得formidable還有的個parse方法,再來一試腰湾。
坑三:formidable.parse()事件無數(shù)據(jù)
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));
}
});
無奈雷恃,通過打印的日志發(fā)現(xiàn),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着逐!打印,其結(jié)構(gòu)如下
[{"fieldname":"my_file_name","originalname":"wo-tai-nan-le.jpg","encoding":"7bit","mimetype":"image/jpeg","buffer":{"type":"Buffer","data":[255,216,255....]}}]
參考files的數(shù)據(jù)結(jié)構(gòu),解決問題就不難了耸别。