You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Vue Composition API结合Ajax提交表单至MongoDB失败排查

表单提交Radio数据到MongoDB失败的问题排查与修复

核心问题分析

  • 未阻止表单默认提交行为:表单提交时浏览器会自动刷新页面,导致fetch请求还没完成就被中断,数据根本传不到后端。
  • 错误获取表单数据:event.target是<form>元素,它本身没有value属性,所以event.target.value会返回undefined,根本拿不到选中的颜色值。

方案一:手动获取数据+阻止默认行为

直接修改onSubmit函数,先拦截默认刷新,再正确获取选中的radio值:

<script>
import { ref, onMounted } from "vue";

export default {
    name: 'SurveyView',
    setup() {
        const onSubmit = (event) => {
            // 阻止页面刷新,让fetch请求正常完成
            event.preventDefault();
            
            // 通过选择器获取选中的radio元素,拿到它的value
            const checkedColor = event.target.querySelector('input[name="color"]:checked').value;
            
            fetch("/survey", {
                method: "post",
                headers: {
                    'Content-Type': 'application/json',
                },
                // 把数据包装成对象,后端更容易解析存入MongoDB
                body: JSON.stringify({ color: checkedColor })
            })
            // 加个请求状态反馈,方便排查问题
            .then(res => res.json())
            .then(data => console.log("提交成功:", data))
            .catch(err => console.error("提交出错:", err));
        };

        onMounted();

        return {
            onSubmit
        }
    }
} 
</script>

方案二:用Vue双向绑定(更符合Vue开发习惯)

通过响应式变量绑定radio的选中状态,不用手动操作DOM,代码更清晰:

模板修改:

<form @submit="onSubmit">
    <fieldset>
        <legend>What is your favourite Color? </legend>
        <div>
            <div>
                <!-- 用v-model绑定响应式变量 -->
                <input type="radio" name="color" value="Red" v-model="selectedColor">
                <label>Red</label>
            </div>
            <div>
                <input type="radio" name="color" value="Blue" v-model="selectedColor">
                <label>Blue</label>
            </div>
        </div>
    </fieldset>
    <button type="submit" class="btn btn-primary">Submit Survey</button>
</form>

脚本修改:

<script>
import { ref, onMounted } from "vue";

export default {
    name: 'SurveyView',
    setup() {
        // 定义响应式变量,初始值设为默认选中的Red
        const selectedColor = ref("Red");
        
        const onSubmit = (event) => {
            event.preventDefault();
            
            fetch("/survey", {
                method: "post",
                headers: {
                    'Content-Type': 'application/json',
                },
                // 直接用响应式变量的值,不用手动找DOM
                body: JSON.stringify({ color: selectedColor.value })
            })
            .then(res => res.json())
            .then(data => console.log("提交成功:", data))
            .catch(err => console.error("提交出错:", err));
        };

        onMounted();

        return {
            onSubmit,
            selectedColor
        }
    }
} 
</script>

额外提醒

  • 要确保后端的/survey接口能正确解析JSON请求体,并且正确将数据插入MongoDB。
  • 保留请求的成功/失败日志,后续出问题时能快速定位是前端还是后端的问题。

内容的提问来源于stack exchange,提问作者RWWW

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 15:20:32