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

为什么将对象写入JSON文件时,id字段的取值总是显示为一对空大括号?

问题原因

你的id函数返回的是Promise对象,你直接将它赋值给userNote的id属性时,并没有等待异步逻辑执行完成拿到最终的id数值。JSON.stringify序列化Promise类型时,由于Promise没有可枚举的自有属性,就会被转为空对象{},这就是你遇到的问题的本质。

解决方法

你需要等待id函数的异步逻辑执行完成,拿到返回的数值后,再构造userNote对象并序列化。可以通过async/await实现,修改你的按钮点击处理逻辑即可:

// 将按钮点击处理函数声明为async
submitButton.addEventListener('click', async () => {
  // 等待异步获取id结果
  const noteId = await id();
  // 拿到id后再构造提交对象
  let userNote = {
    noteName: noteNameInput.value,
    important: noteImportant.value,
    reminder: noteDateInput.value,
    noteMsg: noteMsgInput.value,
    creationDate: creationDate(),
    id: noteId
  }
  let data = JSON.stringify(userNote);
  // 后续提交数据的逻辑写在这里即可
})
优化建议
  1. 你的id函数里的setTimeout完全是多余的,没有任何作用还额外增加了1秒的等待时间,可以直接删掉。
  2. 目前的错误处理逻辑形同虚设,请求失败时会抛出未捕获异常,建议补充异常捕获逻辑,优化后的id函数参考:
async function id(){
  try {
    const PORT = process.env.PORT || 3001;
    const req = await fetch(`http://localhost:${PORT}/api`);
    if(!req.ok) throw new Error('接口请求失败')
    const data = await req.json();
    return data.notes.length;
  } catch(err) {
    console.error('获取id失败:', err)
    throw err
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 11:45:05