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

Type Error循环结构转JSON:Medico更新数据格式异常排查

解决「Converting circular structure to JSON」错误及Medico数据更新问题

核心错误原因

  1. 错误展开FormGroup实例:更新逻辑中...this.medicoForm是直接展开FormGroup对象而非表单值,FormGroup内部存在循环引用的属性(如控件间的关联引用),导致JSON序列化失败。
  2. ID赋值错误:_id: this.medicoSeleccionado.hospital是把整个Hospital对象赋值给_id,而非Medico自身的ID,同时也不符合后端需要的ID格式。
  3. 解构语法问题:尝试const { nombre, email, hospital{ _id} } = medico报错,是因为hospital可能为undefined,未添加可选链处理。

代码修复方案

1. 优化cargarMedico中的解构(可选)

如果要直接解构hospital的ID,需添加可选链处理空值场景:

const { nombre, email, hospital: { _id: hospitalId } = {} } = medico;
// 赋值给表单时使用解构出的hospitalId
this.medicoForm.setValue({ nombre, email, hospital: hospitalId });

2. 关键修复guardarMedico方法

更新逻辑必须使用表单的value而非FormGroup实例,同时正确构造更新数据:

guardarMedico() {
  const { nombre } = this.medicoForm.value;

  if (this.medicoSeleccionado) {
    // 取表单值构造更新数据,传递Medico自身ID
    const data = {
      ...this.medicoForm.value,
      _id: this.medicoSeleccionado._id 
      // 表单value中已包含hospital的ID,无需重复添加
    };

    this.medicoService.actualizarMedico(data)
      .subscribe(resp => {
        console.log(resp);
        Swal.fire('Actualizado', `${nombre} actualizado correctamente`, 'success');
      });

  } else {
    console.log(this.medicoForm.value);
    this.medicoService.crearMedico(this.medicoForm.value)
      .subscribe((resp: any) => {
        console.log(resp);
        Swal.fire('Creado', `${nombre} registrado correctamente`, 'success');
        this.router.navigateByUrl(`/dashboard/medico/${resp.medico._id}`);
      });
  }
}

3. 额外注意事项

  • 确保medicoSeleccionado是纯数据对象,若为类实例可通过JSON.parse(JSON.stringify(medico))转换为无循环引用的JSON对象后再赋值。
  • 确认后端接口接受的更新字段结构与前端传递的data一致,hospital字段需为ID而非完整对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 15:25:21