如何正确捕获错误 - react-query next.js 13 路由处理程序

How to properly catch errors - react-query next.js 13 route handlers

提问人:StackMyFlow 提问时间:9/8/2023 更新时间:9/9/2023 访问量:315

问:

我正在开发一个小型应用程序,我想在用户注册之前检查该电子邮件是否已注册,如果是,则回复错误。

为此,我在 route.ts 文件中将以下响应发送到前端。

return new Response("User already exists", {status: 409})  
or
return new Response("User added", {status: 200})

添加用户工作正常,没有问题,但是当我尝试添加用户两次时,即使我捕获了该错误并显示 toast 通知,它也会向我的控制台发送有关 409 错误消息的轴子。我怎样才能避免这种情况发生,为什么会发生这种情况?


  const form = useForm<z.infer<typeof UserValidator>>({
    resolver: zodResolver(UserValidator),
    defaultValues: {
      website: "",
      email: "",
    },

  })


  const {mutate: createUser, error, isLoading} = useMutation({
    mutationFn: () => {return axios.post('/api/user', form.getValues()).then(res => res.data)},
    onError: (err) => {
      if(err instanceof AxiosError){
        if(err.response?.status === 409){
          return toast({
            title: "This username already exists",
            description: "Choose a different name",
            variant: "destructive"
          })
        }
      }
    },
    onSuccess: (data) => {
      console.log("Success")
    }
  })

  const onSubmit = () => {
    createUser()
  }

  return(
    <>
    <Form {...form}>
      <form onSubmit={form.handleSubmit(onSubmit)} className={`space-y-8 ${showForm ? 'visible' : 'hidden'}`}>
        <div className="flex">
        <FormField
          control={form.control}
          name="email"
          render={({ field }) => (
            <FormItem>
              <FormLabel>Email</FormLabel>
              <FormControl>
                <Input placeholder="Email" {...field} />
              </FormControl>
              <FormMessage />
            </FormItem>
          )}
        />
        <FormField
          control={form.control}
          name="website"
          render={({ field }) => (
            <FormItem>
              <FormLabel>Website</FormLabel>
              <FormControl>
                <Input placeholder="Website" {...field} />
              </FormControl>
              <FormMessage />
            </FormItem>
          )}
        />
        </div>
        <Button type="submit" isLoading={isLoading}>Submit</Button>
      </form>
    </Form>
    </>

  )```
下一个.js axios 突变 tanstackreact-query

评论


答:

0赞 TkDodo 9/9/2023 #1

React Query 在开发模式下将失败的响应记录到控制台。在 v4(当前最新版本)中,可以将自定义记录器传递给 QueryClient 以避免这种情况。

从 v5 开始,自定义记录器将被删除,失败的响应将不再记录到控制台中 - 只会记录需要开发人员解决的真正警告,例如错误的 QueryKeys。

请注意,在这两个版本中,都不应在生产环境中记录任何内容 - 这些日志仅用于开发。