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

