【问题标题】:React.js Send formData with nested fieldArraysReact.js 使用嵌套的 fieldArrays 发送 formData
【发布时间】:2021-09-24 07:39:06
【问题描述】:

所以我面临一个问题,我试图将表单数据发送到我的 REST-api (spring-boot)。如果我通过邮递员发送我的请求,一切都会按预期进行。我发送的请求: my post request with postman

虽然在前端我使用 react-hook-form,但如果我记录数据,一切似乎都在那里,并且看起来与我从邮递员发送的 JSON 相同,但是我不断收到 415 不支持的 mediaType,或者500 内部服务器错误,取决于我尝试发送嵌套数组的方式。到目前为止,我无法找到类似的问题。

我写的代码:

const {handleSubmit, register,control, formState: {errors}} = useForm({mode: 'onBlur'});
const {
    fields: ingredientFields,
    append: ingredientAppend,
    remove: ingredientRemove,
} = useFieldArray({control, name: "ingredients"});
const {
    fields: directionFields,
    append: directionAppend,
    remove: directionRemove
} = useFieldArray({control, name: "directions",})


const formData = new FormData();
async function onSubmit(data) {
    try {
        setLoading(true)
        formData.append("file", data.file[0]);
        formData.append("title", data.title);
        formData.append("description", data.description);
        formData.append("country", data.country);
        formData.append("cookingTime", data.cookingTime);
        formData.append("calories", data.calories);
        formData.append("beef", data.beef);
        formData.append("fish", data.fish);
        formData.append("pork", data.pork);
        formData.append("lamb", data.lamb);
        formData.append("vegan", data.vegan);
        formData.append("vegetarian", data.vegetarian);
        formData.append("spicy", data.spicy);
        formData.append("poultry", data.poultry)
        formData.append("username", user.username);
        formData.append("userCountry", user.country);
        // // formData.append("ingredients", data.ingredients)
        // const ingredientJson = JSON.stringify(data.ingredients)
        // formData.append("ingredients", ingredientJson)
        // JSON.stringify(data)
        // console.log(data.ingredients)
        // // console.log(ingredientJson)
        // console.log(data)
        // console.log(formData)

        const response = await axios.post('http://localhost:8080/api/recipes',
            {
              // formData,
                data
            }
        )
        setLoading(false)
        history.push("/recipe-uploaded");
    } catch (e) {
        console.error("Something went wong" , e);
    }
}

return (
    <div className="page-wrapper">
        <div className="page-wrapper-inner">
            <h1>Add your recipe</h1>
            <form onSubmit={handleSubmit(onSubmit)} className="new-recipe-form">
                {step === 1 && (
                    <div className="file-upload">
                        <label className="custom-file-upload">
                            <input type="file" name="file" {...register("file")}/>
                            <IoMdCloudUpload className="cloud"/><span>Upload an image</span>
                        </label>
                    </div>
                )}
                {step === 2 && (
                    <>
                        <label id="titleLabel" htmlFor="title">
                            <input
                                className="textInput"
                                type="text"
                                name="title"
                                id="title"
                                placeholder="Title..."
                                {...register("title",{required: true})}
                            />
                            {errors.title && errors.title.type === "required" && <span className="errorMessage">Required.</span>}
                        </label>
                        <label htmlFor="description" id="descriptionLabel">
                            <textarea
                                id="description"
                                name="description"
                                placeholder="Description.."
                                {...register("description", {required: true})}

                            />
                            {errors.description && errors.description.type === "required" && <span className="errorMessage">Required.</span>}
                        </label>
                    </>
                )}
                {step === 3 && (
                    <>
                        { ingredientFields.map(({ id }, index) => {
                            return (
                                <div  key={id}>
                                    <div className="ingredient-input-holder">
                                        <label htmlFor={`ingredients[${index}].name`}>
                                            <input
                                                className="textInput"
                                                type="text"
                                                name={`ingredients[${index}].name`}
                                                {...register(`ingredients[${index}].name`)}
                                            />
                                        </label>
                                        <Button
                                            type="button"
                                            classNameButton="btn remove"
                                            buttonTitle={<TiDelete />}
                                            onClickEvent={() => ingredientRemove(index)}
                                        />
                                    </div>
                                </div>
                            );
                        })}
                        <Button
                            type="button"
                            classNameButton="btn"
                            onClickEvent={() => ingredientAppend({})}
                            buttonTitle="Add an ingredient"
                        />
                    </>
                )}
                {step === 4 && (
                    <>
                        { directionFields.map(({ id }, index) => {
                            return (
                                <div key={id}>
                                    <div className="direction-input-holder">
                                        <label htmlFor={`directions[${index}].name`}>
                                            <textarea
                                                name={`directions[${index}].name`}
                                                {...register(`directions[${index}].name`)}
                                            />
                                        </label>
                                        <Button
                                            type="button"
                                            classNameButton="btn"
                                            buttonTitle={<TiDelete />}
                                            onClickEvent={() => directionRemove(index)}
                                        />
                                    </div>
                                </div>
                            );
                        })}
                        <Button
                            type="button"
                            classNameButton="btn"
                            onClickEvent={() => directionAppend({})}
                            buttonTitle="Add an directions"
                        />
                    </>
                )}
                {step === 5 && (
                    <>
                        {loading === true ? (
                            <>
                                <label htmlFor="country" className="details">
                                    <input
                                        list="country"
                                        placeholder="Country of origin"
                                        className="textInput"
                                        name="country"
                                        {...register("country", {required: true})}
                                    />
                                    {errors.country && errors.country.type === "required" && <span className="errorMessage">Required.</span>}

                                </label>
                                <FlagSelector/>
                                <label htmlFor="cookingTime" className="details">
                                    <input
                                        type="number"
                                        className="textInput"
                                        placeholder="Cooking time in minutes"
                                        name="cookingTime"
                                        {...register("cookingTime", {required: true})}
                                    />
                                    {errors.cookingTime && errors.cookingTime.type === "required" && <span className="errorMessage">Required.</span>}

                                </label>
                                <label htmlFor="calories" className="details">
                                    <input
                                        type="number"
                                        className="textInput"
                                        placeholder="Calories"
                                        name="calories"
                                        {...register("calories")}
                                    />
                                </label>
                                <div className="checkbox-wrapper">
                                    <div className="checkbox-wrapper-inner">
                                        <label htmlFor="vegetarian">
                                            <input
                                                type="checkbox"
                                                name="vegetarian"
                                                {...register("vegetarian")}
                                            /> Vegetarian
                                        </label>
                                        <label htmlFor="vegan">
                                            <input
                                                type="checkbox"
                                                name="vegan"
                                                {...register("vegan")}
                                            /> Vegan
                                        </label>
                                        <label htmlFor="beef">
                                            <input
                                                type="checkbox"
                                                name="beef"
                                                {...register("beef")}
                                            /> Beef
                                        </label>
                                        <label htmlFor="fish">
                                            <input
                                                type="checkbox"
                                                name="fish"
                                                {...register("fish")}
                                            /> Fish
                                        </label>
                                        <label htmlFor="pork">
                                            <input
                                                type="checkbox"
                                                name="pork"
                                                {...register("pork")}
                                            /> Pork
                                        </label>
                                        <label htmlFor="lamb">
                                            <input
                                                type="checkbox"
                                                name="lamb"
                                                {...register("lamb")}
                                            /> Lamb
                                        </label>
                                        <label htmlFor="poultry">
                                            <input
                                                type="checkbox"
                                                name="poultry"
                                                {...register("poultry")}
                                            /> Poultry
                                        </label>
                                        <label htmlFor="spicy">
                                            <input
                                                type="checkbox"
                                                name="spicy"
                                                {...register("spicy")}
                                            /> Spicy
                                        </label>
                                    </div>
                                </div>
                            </>
                        ) : (
                            <span>Loading...</span>
                        )}
                    </>
                )}

                {step <= 4 ? (
                    <>
                        <div className="button-wrapper">
                            <Button
                                onClickEvent={() => setStep(step - 1)}
                                buttonTitle="Previous step"
                                classNameButton="btn"
                                disabled={step === 1}
                                type="button"
                            />
                            <Button
                                onClickEvent={() => setStep(step + 1)}
                                buttonTitle="Next step"
                                classNameButton="btn"
                                type="button"
                            />
                        </div>
                    </>
                ) : (
                    <>
                        <div className="button-wrapper submit">
                            <Button
                                onClickEvent={() => setStep(step - 1)}
                                buttonTitle="Previous step"
                                classNameButton="btn"
                                disabled={step === 1}
                                type="button"
                            />
                            <Button
                                buttonTitle="Save recipe"
                                classNameButton="btn"
                                type="submit"
                            />
                        </div>
                    </>
                )}
            </form>
        </div>
    </div>
);

我真的希望这里有人可以帮助我解决这个问题。我觉得我尝试了所有我能找到的东西。

【问题讨论】:

    标签: javascript arrays reactjs axios http-post


    【解决方案1】:

    我已经解决了这个问题,原来问题出在我的后端而不是我的前端。

    【讨论】:

      猜你喜欢
      • 2015-04-30
      • 2018-08-05
      • 1970-01-01
      • 1970-01-01
      • 2011-07-20
      相关资源
      最近更新 更多