如何在 Supertest 上访问 .field 值

How to access .field values on Supertest

晚上好

我正在尝试使用 REST API 上的文件和一些数据创建一个 POST 请求,我正在使用 NodeJS 进行构建。 如果不清楚,我API这个功能的目标是保存图片的寄存器,所以我想在同一个请求中发送图片文件,图片名称和编号。

我目前正在使用 Jest / supertest 进行测试并测试此特定功能,我尝试了以下方法:

    const response = await request(app)
      .post("/uploads/pics")
      .field("name", "PicureName")
      .field("number", "PictureNumber")
      .attach("file", picture);

我从 https://visionmedia.github.io/superagent/#multipart-requests

读到了这个

我的问题是我无法根据我的控制器请求获得 namenumber 的值,所以我可以' 使用它们来保存对象。

我试过很多方法,比如:

req.body.name
req.name
req.field.name
req.query.name

但其中 none 对我有用。

我也尝试打印整个请求,但是我找不到与 namenumber 或 [=31= 相关的任何内容]字段那里。

有谁能告诉我哪里做错了吗?

您应该使用 https://github.com/expressjs/multer 中间件来处理文件上传。然后,req.body 将保留文本字段(如果有的话)。

例如

index.js:

const express = require('express');
const multer = require('multer');
const app = express();

const upload = multer({ dest: 'uploads/' });
app.post('/uploads/pics', upload.single('file'), (req, res) => {
  console.log(req.body);
  console.log(req.file);
  res.sendStatus(200);
});

module.exports = app;

index.test.js:

const request = require('supertest');
const app = require('./');
const path = require('path');
const { expect } = require('chai');

describe('62862866', () => {
  it('should pass', async () => {
    const picture = path.resolve(__dirname, './test.jpg');
    const response = await request(app)
      .post('/uploads/pics')
      .field('name', 'PicureName')
      .field('number', 'PictureNumber')
      .attach('file', picture);
    expect(response.status).to.be.eq(200);
  });
});

集成测试结果:

  62862866
[Object: null prototype] { name: 'PicureName', number: 'PictureNumber' }
{ fieldname: 'file',
  originalname: 'test.jpg',
  encoding: '7bit',
  mimetype: 'image/jpeg',
  destination: 'uploads/',
  filename: '181b96eb9044aac5d50c8c1e3159a120',
  path: 'uploads/181b96eb9044aac5d50c8c1e3159a120',
  size: 0 }
    ✓ should pass (84ms)


  1 passing (103ms)