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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 09:15:37