Node.js中用Axios向外部API传文件报错‘Callback must be a function’求助
解决
Callback must be a function错误及文件上传问题 错误原因
fs.readFile是异步IO方法,调用时必须传入回调函数作为参数,你直接执行fs.readFile('./down.png')不符合API要求,这就是Callback must be a function错误的直接来源。
修复方案
1. 正确读取文件
有两种可靠的读取方式:
- 小文件场景:用同步读取方法
fs.readFileSync,直接获取文件Buffer - 大文件/高并发场景:用异步的
fs.promises.readFile配合async/await
2. 修正Axios请求头
手动设置'Content-Type': 'multipart/form-data'会丢失关键的boundary信息,应该用form.getHeaders()获取form-data自动生成的完整请求头。
3. 处理异步请求
axios.post是异步操作,必须用await等待请求完成,同时要将uploadFile声明为async函数。
修复后的fileUploadController.js代码
const axios = require('axios'); const FormData = require('form-data'); const fs = require('fs'); const path = require('path'); async function uploadFile(req, res, next) { try { // 用绝对路径读取文件,避免路径歧义 const imagePath = path.resolve(__dirname, '../down.png'); // 方式一:同步读取 const image = fs.readFileSync(imagePath); // 方式二:异步读取(替换上面同步代码即可) // const image = await fs.promises.readFile(imagePath); const form = new FormData(); form.append('productName', 'Node.js Stickers'); form.append('productDescription', 'Cool collection of Node.js stickers for your laptop.'); form.append('productImage', image, 'down.png'); // 发送请求,使用form-data自动生成的请求头 const response = await axios.post('http://api.com/api/nuxt', form, { headers: { ...form.getHeaders(), // 可在此添加自定义头,比如Authorization } }); // 返回成功响应给客户端 res.status(200).json({ success: true, data: response.data }); } catch (error) { console.error('文件上传失败:', error); res.status(500).json({ success: false, message: '文件上传失败' }); next(error); } } module.exports = { uploadFile };
额外优化建议
- 模块引入统一放在文件顶部,不要在函数内部
require,提升性能和可读性 - 若你的需求是接收客户端上传的文件再转发,需要用
formidable解析客户端的multipart请求(你的server.js已引入但未使用)
内容的提问来源于stack exchange,提问作者marjan
相关产品推荐
相关产品推荐

