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
相关产品推荐
相关产品推荐

