【问题标题】:Error message: Invalid form input message error issue错误消息:无效的表单输入消息错误问题
【发布时间】:2021-08-02 20:10:00
【问题描述】:

我有一个 Strapi 后端和一个 React 前端。我的 Strapi 后端具有以下用于 Dogs 集合类型的 json 字段:

id, 
Breed,  
Name,       
image,  

在我的前端创建新的 Dog 对象时,我遇到了生成以下错误的输入字段之一:

statusCode:400,错误:“错误请求”,消息:“无效的‘数据’字段。 'data' 应该是有效的 JSON。”

这只发生在接受品种的输入字段中,如果品种输入字段不存在,则名称和文件上传的输入字段有效。

这是我的文件 Create.js 的代码

import React, { useState } from 'react'

export default () => {
  const [Breed, setBreed] = useState('')
  const [Name, setName] = useState('')

  const [file, setFile] = useState(null)

  console.log('file', file)

  const handleSubmit = async (event) => {
    event.preventDefault()

    const formData = new FormData()
    formData.append('data', JSON.stringify({ Breed }))
    formData.append('data', JSON.stringify({ Name }))

    formData.append('files.image', file)

    const response = await fetch('http://localhost:1337/dogs', {
      method: 'POST',
      body: formData,
    })
    const data = await response.json()
    console.log('data', data)
  }

  return (
    <div className='Create'>
      <h2>Create</h2>
      <form action='' onSubmit={handleSubmit}>
        <input
          type='text'
          placeholder='Breed'
          value={Breed}
          onChange={(event) => setBreed(event.target.value)}
        />
        <br />
        <input
          type='text'
          placeholder='Name'
          value={Name}
          onChange={(event) => setName(event.target.value)}
        />
        <br />
        <input
          type='file'
          placeholder='Add a image'
          onChange={(event) => setFile(event.target.files[0])}
        />
        <br />
        <button>Submit</button>
      </form>
    </div>
  )
}

我的代码中缺少什么?

【问题讨论】:

  • 尝试将不带名称的 Breed 对象作为表单数据发送,例如 formData.append('data', JSON.stringify({ Breed })) 并查看它是否有效。我的猜测是它会起作用,因为我没有看到 Bred 输入字段有任何问题。
  • 似乎一次只有一个输入字段有效。当我删除 Name 字段时,Breed 字段有效,如果我删除 Breed 字段,则 Name 字段有效,但不能同时使用。
  • 正如@Matiarx 提到的,我猜是多个 JSON.stringify 是罪魁祸首,但我需要使用 formData。
  • 是的,您的 Bred 字段没有问题。当您发送 formData 时,它将像这样发送,例如: data : {"Bred":"test"} data : {"Name" : "test"} 因为 formData 会将其作为 multipart/form-data 内容类型发送。问题是你如何在服务器端处理这个问题?
  • 数据库确实接收到新创建的对象,只要我提交一个 JSON.stringify 输入,所以问题出在我的代码中多次使用 JSON.stringify 。文件上传不需要 JSON.stringify 这样也可以通过。

标签: reactjs forms


【解决方案1】:

您的 formData 将像这样发送,例如:data : {"Bred":"test"} data : {"Name" : "test"} 因为 content-type for formData 始终是 multipart/form-data 。问题是你如何在服务器端处理这个?我的猜测是您只获取了一个数据值,因此您得到error 400,因为没有正确读取第二个值。据我所知,有两种方法可以解决这个问题:

  1. 使用不同的键添加JSON数据,例如:

    formData.append('breedtest', JSON.stringify({ Breed }))

    formData.append('nametest', JSON.stringify({ Name }))

然后像这样发送:

const response = await fetch('http://localhost:1337/dogs', {
      method: 'POST',
      body: formData,
    })

比在服务器端处理它更容易。

  1. 像这样从 formData 创建 JSON 对象:

    formData.append("Breed", Breed ); formData.append("Name", Name );

const json = JSON.stringify(Object.fromEntries(formData));

并发送json 对象作为您的请求正文。

const response = await fetch('http://localhost:1337/dogs', {
      method: 'POST',
      headers: {
      'Content-Type': 'application/json'},
      body: json,
    })

【讨论】:

  • 我试过了,但我得到的是一个空对象。我们可以使用 Code Sandbox 设置在线代码示例吗?我这个项目的网址是codesandbox.io/s/quirky-curie-p3ixk?file=/src/App.js
  • 你能发布你的服务器端代码吗?我们不能使用这个沙箱,因为我没有在 localhost:1335 上运行服务器,而且我将无法发布数据并获得回复
  • 这样发送数据:formData.append('breed', JSON.stringify({ Breed })) formData.append('name', JSON.stringify({ Name })) formData.append ('files.image', file) 然后像之前一样设置 body: formData ,或者像这样: formData.append('Breed', Breed) formData.append('Name', Name) const json = JSON. stringify(Object.fromEntries(formData)) 即只在 body 中发送这个 json 变量,就像这个 body:json 不要像在沙箱中发送它一样发送它
  • 我尝试了两种变体,第一个创建了一个没有数据的对象,第二个生成:“statusCode: 400, error: "Bad Request", message: "When using multipart/form-data you需要在 JSON '数据' 字段中提供您的数据。"" 你能更新我的沙箱或分叉它并制作你的版本,或者我们可以屏幕共享,我可以向你展示我的屏幕吗?我的服务器端代码是由我的strapi 后端生成的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-09
  • 2019-05-08
  • 1970-01-01
  • 1970-01-01
  • 2016-07-22
  • 2013-10-15
  • 2017-07-02
相关资源
最近更新 更多