Javascript Can';t将对象推送到nodejs中的数组
获取类型错误:data.push不是函数Javascript Can';t将对象推送到nodejs中的数组,javascript,node.js,async-await,Javascript,Node.js,Async Await,获取类型错误:data.push不是函数 在Object.addContact(/Users/jewkuza/Documents/goit-node-hw-01/contacts.js:43:30)数据是字符串,而不是数组,因此没有可用的方法推送 您可能缺少一个JSON.parse(): const data=wait fsPromises.readFile(contactsPath,编码); const parsedData=JSON.parse(数据) const updatedata=pa
在Object.addContact(/Users/jewkuza/Documents/goit-node-hw-01/contacts.js:43:30)
数据是字符串,而不是数组,因此没有可用的方法推送
您可能缺少一个JSON.parse()
:
const data=wait fsPromises.readFile(contactsPath,编码);
const parsedData=JSON.parse(数据)
const updatedata=parsedData.push({
id:uid,
姓名:姓名,,
电邮:电邮,,
电话:电话,,
});
尽管事实上,您的代码只是缺少fsPromises定义的一个片段,但这里有两个bug
readFile返回字符串而不是数组(请参见此处:)
将变量updateData
写回文件。Array.push返回数组的新长度,而不是更新的数组。您可能想要回写数据
您是否可以检查数据类型,如console.log(数据类型)
?由于.push是一个数组函数,我认为数据是objectiffspromissions.readFile()
只是一个包装器,在fs.readFile()
周围有承诺,然后它返回Promise
,它不是对象数组(!)从文件读取总是读取字符串,除非你的readFile
函数不知何故没有…你的意思是JSON.parse
文件内容吗…?,它的承诺不是用数组实现的,而是用缓冲区或字符串实现的。(假设encoding
不是undefined
,则本例中的字符串也返回数组的新长度,而不是您推送的内容(根据从push
获取后对updateData
所做的操作推断)。当您得到意外结果时,最好先检查文档。@deceze-或缓冲区
,但在本例中是字符串,因为提供了编码(假设编码
不是未定义
)。
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);
}
}