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

使用GraphQL与React创建新帖子页面时遇400网络错误,求排查

排查GraphQL+React创建帖子时的400错误

以下是导致你遇到Network error: Response not successful: Received status code 400错误的核心原因及修正方案:

1. useMutation 解构逻辑错误(最关键问题)

useMutation Hook的返回值顺序是:执行mutation的函数在前,然后是包含loading/error/data的状态对象。你现在把第一个返回值命名为data并传给PostForm的action属性,相当于把无效值(初始状态为undefined)作为提交函数传入,导致请求格式完全不符合GraphQL要求,直接触发400错误。

修正代码:

// NewPost组件中的useMutation部分
const [createPost, { loading, error, data }] = useMutation(NEW_POST, {
  onCompleted: data => {
    props.history.push(`posts/${data.createPost._id}`);
  }
});

// 传给PostForm的应该是真正的mutation执行函数createPost
<PostForm action={createPost} />

2. useState 未设置初始值

你写的const [values, setValues] = useState();没有传入初始值,初始状态为undefined。用户第一次输入时,...values会因无法展开undefined导致状态更新异常,最终提交给GraphQL的变量可能缺失或格式错误。

修正:

// 初始化表单状态为包含所有字段的空对象
const [values, setValues] = useState({ title: '', category: '', body: '' });

3. 表单控件未绑定value(受控组件异常)

当前的input和TextArea没有设置value属性,属于非受控组件,可能导致输入值无法正确同步到state,最终提交的变量不完整,触发后端校验失败返回400。

修正每个表单控件,示例:

<input
  required
  type="text"
  id="title"
  name="title"
  placeholder="title"
  onChange={onChange}
  value={values.title}
/>

// category输入框和TextArea同理
<TextArea
  required
  name="body"
  placeholder="Post content"
  onChange={onChange}
  value={values.body}
/>

4. 额外优化:useEffect 缺少依赖数组

虽然这不是导致400的直接原因,但useEffect(() => { document.title = ... })没有依赖数组,会在每次组件渲染时重复执行。建议添加空数组让它仅在组件挂载时执行一次:

useEffect(() => {
  document.title = 'NewPost - Notedly';
}, []);

可选检查:GraphQL参数类型匹配

看你提供的示例mutation,category传入的是MongoDB风格ID字符串,你的mutation定义中$category: String是兼容的,但如果后端createPost接口要求category为ID类型,需确认参数类型是否匹配(这类问题通常返回GraphQL语法错误而非400,但可以作为兜底检查项)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 15:36:19