如何使用 supertest 发送 formData 对象?

Fen*_*hao 9 node.js superagent supertest

我刚刚开始学习使用 supertest 和 mocha 进行测试。我读过supertest的api文档,它说supertest支持superagent提供的所有较低级别的API。SuperAgent 说我们可以通过以下方式发送 formData 对象:

request.post('/user')
    .send(new FormData(document.getElementById('myForm')))
    .then(callback)
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用 supertest 发送 formData 对象时,如下所示:

server
    .post('/goal_model/images/' + userId + '/' + tmid)
    .set('Authorization',`Bearer ${token}`)
    .send(formData)
    .expect("Content-type",/json/)
    .expect(201)
    .end(function(err,res){
         should(res.status).equal(201);
         console.log(res.message);
         done();
    });
Run Code Online (Sandbox Code Playgroud)

其中 formData 是这样的:

let file;
let formData = new FormData();
let fn = "../../../Downloads/Images/5k.jpg";
formData.append("image", file);
Run Code Online (Sandbox Code Playgroud)

然后,当我尝试发送这个对象时,它只是说:

TypeError: "string" must be a string, Buffer, or ArrayBuffer
Run Code Online (Sandbox Code Playgroud)

是否可以通过这种方式发送 formData 对象?我做错了什么或者该怎么做?如果没有,为什么?我搜索了很多相关问题,但没有一个能解决我的问题。我现在真的很挣扎。

sli*_*wp2 4

您可以使用.attach()方法supertest将文件发送到服务器。的函数签名.attach

\n\n
attach(field: string, file: MultipartValueSingle, options?: string | { filename?: string; contentType?: string }): this;\n
Run Code Online (Sandbox Code Playgroud)\n\n

参数的数据类型file可以是:

\n\n
type MultipartValueSingle = Blob | Buffer | fs.ReadStream | string | boolean | number;\n
Run Code Online (Sandbox Code Playgroud)\n\n

这里我将文件路径传递给.attach方法。

\n\n

例如

\n\n

server.ts:

\n\n
import express from \'express\';\nimport multer from \'multer\';\nimport path from \'path\';\n\nconst app = express();\nconst port = 3000;\nconst upload = multer({ dest: path.resolve(__dirname, \'uploads/\') });\napp.post(\'/upload\', upload.single(\'avatar\'), (req, res) => {\n  console.log(\'file:\', req.file);\n  console.log(\'content-type:\', req.get(\'Content-Type\'));\n  res.sendStatus(200);\n});\n\nif (require.main === module) {\n  app.listen(port, () => {\n    console.log(`HTTP server is listening on http://localhost:${port}`);\n  });\n}\n\nexport { app };\n
Run Code Online (Sandbox Code Playgroud)\n\n

server.test.ts:

\n\n
import { app } from \'./server\';\nimport request from \'supertest\';\nimport path from \'path\';\n\ndescribe(\'52359964\', () => {\n  it(\'should pass\', () => {\n    return request(app)\n      .post(\'/upload\')\n      .attach(\'avatar\', path.resolve(__dirname, \'./downloads/5k.jpg\'))\n      .expect(200);\n  });\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

集成测试结果:

\n\n
  52359964\nfile: { fieldname: \'avatar\',\n  originalname: \'5k.jpg\',\n  encoding: \'7bit\',\n  mimetype: \'image/jpeg\',\n  destination:\n   \'/Users/ldu020/workspace/github.com/mrdulin/expressjs-research/src/stackoverflow/52359964/uploads\',\n  filename: \'329756ab22bf7abe2d27866a322c2f30\',\n  path:\n   \'/Users/ldu020/workspace/github.com/mrdulin/expressjs-research/src/stackoverflow/52359964/uploads/329756ab22bf7abe2d27866a322c2f30\',\n  size: 0 }\ncontent-type: multipart/form-data; boundary=--------------------------777489367435889931561092\n    \xe2\x9c\x93 should pass (42ms)\n\n\n  1 passing (48ms)\n
Run Code Online (Sandbox Code Playgroud)\n