【问题标题】:Can't push an object to an array in nodejs [closed]无法将对象推送到nodejs中的数组[关闭]
【发布时间】:2020-12-20 09:48:29
【问题描述】:
async function addContact(name, email, phone) {
  try {
    const data = await fsPromises.readFile(contactsPath, encoding);
    const updatedData = data.push({
      id: uid,
      name: name,
      email: email,
      phone: phone,
    });
    await fsPromises.writeFile(contactsPath, JSON.stringify(updatedData));
    console.log(updatedData);
  } catch (err) {
    console.error(err);
  }
}

获取类型错误:data.push 不是函数 在 Object.addContact (/Users/jewkuza/Documents/goit-node-hw-01/contacts.js:43:30)

【问题讨论】:

  • 你能检查像console.log(typeof data)这样的数据类型吗?由于 .push 是一个数组函数,我认为数据是对象
  • 如果fsPromises.readFile() 只是在fs.readFile() 周围有承诺的包装器,那么它返回Promise<string | Buffer> 这不是对象数组(!)
  • 从文件中读取总是读取一个字符串,除非 your readFile 函数以某种方式不... 你是说JSON.parse 文件内容...?
  • readFile 的 promise 不满足数组,它满足 Buffer 或字符串。 (在您的情况下为字符串,假设 encoding 不是 undefined。)此外,push 返回数组的新长度,而不是您推送的内容(根据您在获取 updatedData 后的操作推断push)。当您得到意想不到的结果时,最好的办法是首先检查文档。
  • @deceze - 或Buffer,但在这种情况下是字符串,因为提供了编码(假设encoding 不是undefined)。

标签: javascript node.js async-await


【解决方案1】:

尽管您的代码只是一个缺少 fsPromises 定义的 sn-p,但这里有两个错误。

  1. readFile 返回一个字符串而不是一个数组(参见此处:https://nodejs.org/api/fs.html#fs_fs_readfile_path_options_callback

  2. 您将变量updatedData 写回文件。 Array.push 返回数组的新长度,而不是更新后的数组。您可能想写回数据。

【讨论】:

    【解决方案2】:

    data 是一个字符串,而不是一个数组,所以没有方法 push 可用。

    您可能缺少JSON.parse()

    const data = await fsPromises.readFile(contactsPath, encoding);
    const parsedData = JSON.parse(data)
    const updatedData = parsedData.push({
          id: uid,
          name: name,
          email: email,
          phone: phone,
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-30
      • 1970-01-01
      • 2020-11-16
      相关资源
      最近更新 更多