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

使用Jest测试Node.js多文件上传时报类型不匹配错误如何解决?

报错原因

你遇到的类型报错是因为supertest请求库的attach方法不支持直接传入文件路径数组作为参数,该方法第二个参数仅接受单个文件路径、Buffer等MultipartValueSingle类型的值,你传入string[]类型的数组不符合类型约束。
另外你当前手动设置的Content-Type: application/octet-stream配置错误,多文件表单上传需要使用multipart/form-data类型,该请求头不需要手动配置,supertest会在调用attach方法时自动生成带正确boundary参数的请求头。

修复方案
  • 删掉手动设置Content-Type的代码
  • 放弃直接传入文件数组的写法,循环调用attach方法,多次传入同一个字段名postDocs即可实现多文件上传

修复后完整代码如下:

it('Create feed (POST)', () => {
    const video = path.resolve(__dirname, `../test-files/movie_video.mp4`);
    const image = path.resolve(__dirname, `../test-files/thumbnail.jpg`);
    const pdfDoc = path.resolve(__dirname, `../test-files/pdf_doc.pdf`);

    const requestInstance = request(app.getHttpServer())
        .post('/feed')
        .set('Authorization', 'Bearer ' + accessToken)
        .field('text', 'Aenean imperdiet. Nam ipsum risus,. Curabitur suscipit suscipit tellus.')
        .field('payment_amount', 0);
    
    // 循环调用attach 传同一个字段名实现多文件上传
    [video, image, pdfDoc].forEach(filePath => {
        requestInstance.attach('postDocs', filePath);
    });

    return requestInstance
        .expect(function (res) {
            if (!('message' in res.body) || !('payload' in res.body)) {
                throw new Error('Response should contain message and payload.');
            } else if (res.body.message !== StatusMessages.Default) {
                throw new Error('User not logged in');
            }
            if (!('user' in res.body.payload)) {
                throw new Error('Payload should contain user.');
            }
            adminAccessToken = res.body.payload.access_token;
        });
});

内容的提问来源于stack exchange,提问作者Daniel Greatman Walter

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 06:36:03