You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:56:53