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

Node.js监控文件夹上传文件时遇TypeError错误求助

问题修复与路由配置方案

一、修复uploadFile函数的报错

你的报错核心是**fs.readFile调用时未传入合法的回调函数**——Node.js原生fs.readFile(回调模式)必须接收文件路径、可选编码、回调函数三个参数(编码可选,但回调是必填项)。如果想用异步非回调写法,需改用fs.promises.readFile。

错误写法示例(导致报错)

// 错误:仅传入文件路径,未传回调函数
fs.readFile(filePath);
// 错误:混淆异步/同步写法,readFile是异步函数,不能直接赋值结果
const fileData = fs.readFile(filePath);

修复方案1:回调模式

const fs = require('fs');
const axios = require('axios');
const FormData = require('form-data');
const path = require('path');

function uploadFile(filePath) {
  fs.readFile(filePath, (readErr, fileData) => {
    if (readErr) {
      console.error('读取文件失败:', readErr);
      return;
    }
    // 构建FormData用于文件上传
    const formData = new FormData();
    formData.append('uploadedFile', fileData, { filename: path.basename(filePath) });
    
    // 发送POST请求到服务器
    axios.post('http://你的服务器IP:端口/upload', formData, {
      headers: formData.getHeaders()
    })
    .then(res => console.log('上传成功:', res.data))
    .catch(uploadErr => console.error('Error uploading file:', uploadErr));
  });
}

修复方案2:Async/Await模式(更易维护)

const fs = require('fs/promises'); // 使用Promise版文件系统API
const axios = require('axios');
const FormData = require('form-data');
const path = require('path');

async function uploadFile(filePath) {
  try {
    const fileData = await fs.readFile(filePath);
    const formData = new FormData();
    formData.append('uploadedFile', fileData, { filename: path.basename(filePath) });
    
    const res = await axios.post('http://你的服务器IP:端口/upload', formData, {
      headers: formData.getHeaders()
    });
    console.log('上传成功:', res.data);
  } catch (err) {
    console.error('Error uploading file:', err);
  }
}

二、服务器端app.post路由配置(Express框架)

服务器需要处理文件上传,推荐用multer中间件简化逻辑:

1. 安装依赖

npm install express multer

2. 完整路由配置代码

const express = require('express');
const multer = require('multer');
const app = express();

// 配置文件存储规则
const storage = multer.diskStorage({
  destination: (req, file, cb) => {
    cb(null, './uploads'); // 确保项目根目录下的uploads文件夹已创建
  },
  filename: (req, file, cb) => {
    cb(null, file.originalname); // 保留原文件名,可自定义规则
  }
});

const uploadMiddleware = multer({ storage: storage });

// 上传接口路由
app.post('/upload', uploadMiddleware.single('uploadedFile'), (req, res) => {
  if (!req.file) {
    return res.status(400).send('未选择上传文件');
  }
  res.status(200).json({
    message: '文件上传成功',
    file: {
      name: req.file.originalname,
      savePath: req.file.path
    }
  });
});

// 启动服务器
app.listen(3000, () => {
  console.log('服务器运行在 http://localhost:3000');
});

关键注意点

  • 服务器端需提前创建uploads目录,否则multer会抛出文件路径不存在的错误
  • 客户端FormData中文件的key(示例中为uploadedFile)必须与服务器端uploadMiddleware.single('xxx')的参数完全一致
  • 如需批量上传,可替换为uploadMiddleware.array('uploadedFile', 10)(支持最多10个文件)

内容的提问来源于stack exchange,提问作者bnew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 10:55:26