如何阻止文件被fs.writefile覆盖



问题是,当我试图保存从nodejs中使用socket.io创建的聊天室中获得的数据时,一旦用户将消息提交到聊天室,该文件就会不断被覆盖。但是,我希望将用户名+消息添加到文件中,而不是覆盖它,这样用户名和消息都将作为对象存储在JSON文件中。

这就是我最初尝试的:

socket.on('send-chat-message', message => {
socket.broadcast.emit('chat-message',{ message: message, name: users[socket.id] })
var collect = {
message: message,
name: users[socket.id] 
}
var savechatData = JSON.stringify(collect)
fs.writeFile('./public/static/chattingdata/chat.json', savechatData, function (error) {
if (error) {
console.log("There has been an error saving your configuration data")
console.log(error.message)
return
}
console.log('Configuration saved succesfully')
})
})
})

但那只会覆盖它。所以我试着这样做:

socket.on('send-chat-message', message => {
socket.broadcast.emit('chat-message',{ message: message, name: users[socket.id] })
var collect = {
message: message,
name: users[socket.id] 
}
var savechatData = JSON.stringify(collect)
fs.writeFile('./public/static/chattingdata/chat.json', {'flags': 'a'}, savechatData, function (error) {
if (error) {
console.log("There has been an error saving your configuration data")
console.log(error.message)
return
}
console.log('Configuration saved succesfully')
})
})
})

但后来我得到了错误:"ERR_INVALID_OPT_VALUE_ENCODING">

那么我该如何解决这个问题呢?

fs.writeFile函数的签名是fs.writeFile(file, data[, options], callback)。数据参数应作为第二个参数给出,可选选项参数应为第三个参数。请参阅此处的文档

从更改您的代码

fs.writeFile('./public/static/chattingdata/chat.json', {'flags': 'a'}, savechatData, function (error){ // Callback })

fs.writeFile('./public/static/chattingdata/chat.json', savechatData, {'flags': 'a'}, function (error) { // callback })

最新更新