Fs 错误地读取或保存导致 NaN 的文件。如何处理?
Posted
技术标签:
【中文标题】Fs 错误地读取或保存导致 NaN 的文件。如何处理?【英文标题】:Fs incorrectly reads or saves file leading to NaN. How to deal with it? 【发布时间】:2022-01-08 11:53:07 【问题描述】:我正在使用 Fs 将一些数据保存在文件中。我从第一行中的 0 和第二行中的 0 开始。然后我想在第二行加一。有时经过一些尝试(随机,有时是 100 次,有时是 700 次)会发生一些事情,导致第一个空行和第二个空行。代码:
const Discord = require("discord.js");
const fs = require('fs');
module.exports =
name: "testkom",
aliases: [],
async execute(message, args, client)
var data = fs.readFileSync('peakcommands.txt').toString().split("\n");
data[1]++;
var text = data.join("\n");
fs.writeFile('peakcommands.txt', text, function (err)
if (err) return console.log(err);
);
message.channel.send (data[1]);
【问题讨论】:
尝试控制台日志记录并告诉我们data[1]
在进入 NaN 之前记录了什么
如果您调用execute()
而不等待前一个完成,您可能会与尝试读取/写入同一文件的两个单独操作发生冲突。请注意,您的 execute()
函数甚至不会告诉调用者何时完成,因为 fs.writeFile()
是异步的。如果此处同步 I/O 正常,则尝试切换到 fs.writeFileSync()
。由于这是阻塞的,这将防止您自己的应用程序在写入该文件时与自身发生冲突。
请给我们看peakcommands.txt
的内容
应该指定编码 - fs.readFileSync('peakcommands.txt', 'utf8')
您还可以在data[1]++
之后添加以下诊断。 if (typeof data[1] !== "number") console.log(data[1], data);
抓住它的作用,看看一切都搞砸了。我的猜测是 data[1]
不能转换为数字(不是数字),所以那时你是 NaN。
【参考方案1】:
我认为这可能是编码问题,也可能是数据竞争。
要修复可能的竞争条件,请将fs.writeFile
切换为fs.writeFileSync
,这将确保文件写入是同步的。
要解决编码问题,您可以指定编码,如下所示:
fs.writeFileSync('peakcommands.txt', 'utf8' text, function (err)
if (err) return console.log(err);
);
如果不起作用,请检查docs。
【讨论】:
这似乎正在工作。以前立即循环到 2000 只会在文件中产生错误的值。这个去2000没有问题。这里编码的重要性是什么?似乎没有它也能正常工作 编码可以帮助以某种奇怪的自动假定格式写入数据。我不确定它是否会做任何事情,通常最好澄清编码以消除可能的错误。以上是关于Fs 错误地读取或保存导致 NaN 的文件。如何处理?的主要内容,如果未能解决你的问题,请参考以下文章
使用 FS 读取字符串返回此错误:位置 0 处 JSON 中的意外标记 r
如何读取 JSON 文件、更改一些值并保存它。使用 FS/Javascript [重复]