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

C#读取Excle文件时报错,怎么处理?

node 之 fs流读写

如何读取 JSON 文件、更改一些值并保存它。使用 FS/Javascript [重复]

LNK1107文件无效或损坏: 无法在 0x308 处读取 解决方案

如何从节点中的ReadStream同步读取