【发布时间】: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 这样也可以通过。