Node.js报错TypeError: Cannot read property 'mv' of undefined求助
排查Node.js中TypeError: Cannot read property 'mv' of undefined错误
这个报错本质是你想调用mv()方法的sampleFile变量是undefined——说白了就是你没正确拿到上传的文件对象。咱们一步步理清楚问题和解决办法:
错误原因分析
你用的fileUpload()应该是express-fileupload中间件对吧?这个中间件处理完上传后,会把文件存在req.files这个对象里,而不是数组。它是按照你前端表单里的文件输入字段名来作为键存储的——比如你前端写的是<input type="file" name="sampleFile">,那req.files里对应的键就是sampleFile。
但你的代码里用了let sampleFile = req.files[0];,试图用数组索引去取文件,这完全不符合这个中间件的用法,自然拿不到东西,sampleFile就变成了undefined,调用mv()的时候就会触发这个报错。
解决办法
1. 修正文件获取方式
把获取文件的代码改成按字段名取,对应你注释里提到的sampleFile字段:
let sampleFile = req.files.sampleFile;
2. 完善mv()的路径参数
另外注意:mv()方法需要传入完整的文件路径(包含文件名),而不是只传文件夹路径。不然服务器不知道要把文件存成什么名字,会出问题。比如你想保留原文件名的话,可以这么写:
const savePath = 'C:/Users/MNaaraayanan/Downloads/boilerplate_new/src/main/ngapp/' + sampleFile.name; sampleFile.mv(savePath, function(err) { if (err) return res.status(500).send(err); res.send('文件上传成功!'); });
3. 如果是多文件上传的情况
如果你允许用户一次上传多个文件(前端input加了multiple属性,比如<input type="file" name="sampleFile" multiple>),这时候req.files.sampleFile才会变成数组,这时候你才能用索引去取单个文件,比如:
// 取第一个上传的文件 let sampleFile = req.files.sampleFile[0];
修正后的完整示例代码
app.use(fileUpload()); app.post('/upload', function(req, res) { if (!req.files) return res.status(400).send('No files were uploaded.'); console.log(req.files); // 这里可以打印出来看看结构,确认字段名 let sampleFile = req.files.sampleFile; const savePath = 'C:/Users/MNaaraayanan/Downloads/boilerplate_new/src/main/ngapp/' + sampleFile.name; sampleFile.mv(savePath, function(err) { if (err) return res.status(500).send(err); res.send('File uploaded successfully!'); }); });
内容的提问来源于stack exchange,提问作者Muthu Naaraayanan
相关产品推荐
相关产品推荐

