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

如何使用Chai测试无需多部分表单数据的文件上传?

问题分析与解决方案

看起来你遇到的核心问题是:尝试用JSON格式发送文件内容来测试接口,但后端通过body-parser无法正确解析req.body。这主要是因为你直接传递了fs.readFileSync返回的Buffer数据,而没有处理成body-parser能识别的合法JSON格式。

下面是具体的修复步骤和排查建议:

1. 修正前端测试代码:正确处理文件内容

fs.readFileSync默认返回的是Buffer对象,直接传给Chai的send()方法时,不会自动被序列化为合法的JSON字符串,导致后端收到的请求内容不符合JSON格式,body-parser解析失败,最终req.body为空或异常。

你可以用两种方式修复测试代码:

方式一:先转成字符串再解析为JS对象(推荐,提前发现JSON语法错误)

it('Create node', () => {
  // 读取文件为UTF-8字符串
  const fileContent = fs.readFileSync('test/manifest/sensor_nodes.json', 'utf8');
  // 解析为JS对象(如果JSON格式错误会直接报错,方便排查)
  const nodeData = JSON.parse(fileContent);
  
  return chai.request(server)
    .post('/api/sensornodes')
    .set('Content-Type', 'application/json')
    .send(nodeData) // 发送JS对象,Chai会自动序列化为JSON字符串
    .then((res) => {
      expect(res.status).to.eql(204);
    })
    .catch((err) => {
      // 新增错误捕获,方便排查测试失败原因
      console.error('测试请求失败:', err.response?.text || err.message);
      throw err;
    });
});

方式二:直接发送UTF-8字符串(适合确认JSON格式完全合法的情况)

it('Create node', () => {
  const fileContent = fs.readFileSync('test/manifest/sensor_nodes.json', 'utf8');
  
  return chai.request(server)
    .post('/api/sensornodes')
    .set('Content-Type', 'application/json')
    .send(fileContent) // 直接发送JSON字符串
    .then((res) => {
      expect(res.status).to.eql(204);
    });
});

2. 检查后端body-parser配置

确保你已经正确启用了JSON解析器,并且根据文件大小设置了合适的内容限制(如果你的JSON文件较大):

import express from 'express';
const app = express();

// 配置JSON解析器,设置内容大小限制(示例为10MB,可根据实际调整)
app.use(express.json({ limit: '10mb' }));

// 你的路由注册
app.post('/api/sensornodes', yourController.create);

3. 额外排查点

  • 确认sensor_nodes.json文件本身是合法的JSON格式:比如有没有遗漏引号、多余逗号等语法错误,可以用在线JSON校验工具检查。
  • 在后端create方法中打印请求的content-type和原始内容,确认请求格式是否正确:
    public create(req: Request, res: Response, next: NextFunction) {
      console.log("请求Content-Type:", req.get('Content-Type'));
      console.log("原始请求内容:", req.rawBody); // 需要配置express.json({ rawBody: true })才能获取
      console.log("解析后的req.body:", req.body);
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:43:56