发布表单数据时请求正文为空

Request body is empty when posting form-data

我正在向我的后端使用一个简单的 post 请求来获取表单数据,但出于某种原因,正文总是空的。 我试图隔离这个所以我将内容类型更改为应用程序 json 并将数据更改为 json 只有这样我才能发送数据。

客户端:

submitForm(event) {
        event.preventDefault();
        console.log("gggg");
        const data = new FormData(event.target);

         axios.post("http://localhost:4000/user-form-post",data).then(function (response) {
            //handle success
            console.log(response);
        })
        .catch(function (response) {
            //handle error
            console.log(response);
        });

服务器端:

// app.use(bodyParser.json());
// app.use(bodyParser.urlencoded({extended:true}));

app.use(express.urlencoded());

// Parse JSON bodies (as sent by API clients)
app.use(express.json());

app.use(logger('dev'));
app.post('/user-form-post', (req,res) =>{

    console.log("dfdf");
    console.log(req.body); // alwayes print empty dict {}
    res.end();

})

这不起作用,因为它需要 jsons(预期行为):

// app.use(bodyParser.json());
// app.use(bodyParser.urlencoded({extended:true}));

与 Postman 的行为相同。

您需要从 express 端解析您的表单数据。为此,您将不得不使用 multer 或 multiparty。尝试这样的事情。也请参考文档

const multiparty = require('multiparty');

app.post('/user-form-post', (req,res) =>{

   let form = new multiparty.Form();

   form.parse(req, function(err, fields, files) {
      Object.keys(fields).forEach(function(name) {
           console.log('got field named ' + name);
       });
   });
})

当您 post 数据为 data type 时请求正文出现问题。

我最近遇到了 Postman 的问题。 您应该 post 类型为 x-www-form-urlencodedraw->JSON 的数据来解决问题。

祝你好运。

说到我的问题, 我有这个前端

 const form = new FormData();
      form.email = this.email;
      form.password = this.password;
      console.log("onSubmit -> form", form);

axios.post("http://localhost:3000/register",  form )

onSubmit -> form FormData {email: "admin@gmail.com", password: "123"}

但是后端的 req.body 是空的,我发现 axios.post 中的表单仍然需要 1 个括号 {} 即使它是一个对象。像这样

axios.post("http://localhost:3000/register", { form })

在后端得到像这样的主体之后

req.body = { form: { email: 'admin@gmail.com', password: '123' } }

您正在使用:

app.use( bodyParser.json() );  // to support JSON-encoded bodies
app.use(bodyParser.urlencoded({ // to support URL-encoded bodies
  extended: true
}));

请也使用下面给出的行代码,但首先安装 multer 并将代码写在您的应用程序顶部:

var multer = require('multer');
var upload = multer();

app.use(express.json()); 

我在发布的代码中也遇到了同样的问题。

但是我已经使用附图中突出显示的以下代码解决了这个问题:-

enter image description here

没有使用 "Content-Type" 来解决这个问题。

希望您使用上述代码片段解决您的问题。

遇到同样的问题,用了2天。以下是我找到的解决方案:

  1. 我的请求负载有 JSON.stringify() ,它会使 body 为 {} 空 object 。当我删除 JSON.stringify() 并发送请求时它起作用了。
  2. 内容类型应该是 multipart-form :boundary -----
  3. 现在,如果我从外部将其设置为 multipart-form,边界的东西就不见了。 对于少数人来说,当你将 content-type 设置为 false / undefined 时它起作用了,边界的东西被加起来了,但对我来说不是。
  4. 尽管我遵循了所有步骤并将 FormData 作为负载发送,但负载是网络选项卡中的请求负载 object 而不是 FormData object ,我的请求失败并显示 500 。
  5. 我尝试了下面的代码,它是 react + typescript(进行必要的更改以避免语法错误)

import QueryString from 'qs';
import { ApiParams } from './xyzfile';
import { ApiHandlerRawType } from './types/xyzfile';



const setDefaultOptions = ({
  method = '',
  url = '',
  params = {},
  data = {},
  signal = null,
  headers = new Headers(),
  ...options
} = {}) => ({
  method,
  url,
  params,
  signal,
  headers,
  data,
  ...options
});

const setData = ({ method, data, ...options }: ApiHandlerRawType) => {
  const option = options;
  if (method !== 'GET' && option.isStreamData) {
    option.body = data;
  }
  return {
    method,
    ...option
  };
};

const addRequestHeaders = ({ headers = new Headers(), ...options }) => {
  const { existingHeaders }: ApiHandlerRawType = options;
  if (existingHeaders) {
    Object.entries(existingHeaders).forEach(([key, value]) => {
      if (key !== 'Content-Type') headers.set(key, value);
    });
  }
  return {
    headers,
    ...options
  };
};

export const ApiHandlerRaw = ({
  url,
  ...originalOptions
}: ApiHandlerRawType): Promise<Response> => {
  const options = setData(
    addRequestHeaders(setDefaultOptions(originalOptions))
  );
  return fetch(url || '', options)
    .then(response => {
      if (!response.ok) throw new Error(response.statusText);
      return Promise.resolve(response);
    })
    .catch(err => Promise.reject(err));
};

export const FileUploadApiHandler = async ({
  headers,
  ...options
}: ApiHandlerRawType): Promise<Response | Blob> => {
  const response = await ApiHandlerRaw({
    headers,
    isStreamData: true,
    ...options
  });
  return response;
};

    export const fileApiService = ({
      url,
      method,
      qsObject,
      headers,
      reqObjectAsStreamData
    }: ApiParams): Promise<Response> => {
      const qs = QueryString.stringify(qsObject, { addQueryPrefix: true });
      const urlPath = `${url}${qs}`;
      const data = reqObjectAsStreamData;
      const existingHeaders = headers;
      return FileUploadApiHandler({
        url: urlPath,
        method,
        data,
        existingHeaders
      }) as Promise<Response>;
    };

从 fileApiService 发送所需的变量。 existingHeaders 将是您的应用 headers ,例如:token / ids ...等。 fileApiService 中的数据是 body .