【问题标题】:fs.WriteFile() returning NULL and not writing to JSON filefs.WriteFile() 返回 NULL 并且不写入 JSON 文件
【发布时间】:2021-02-11 20:48:15
【问题描述】:

我有一个将数据写入“sequence.json”文件的 Javascript 文件。但是,我的控制台中不断返回 NULL 的重复。然后,当我查看我的“sequence.json”文件时,它会更新,但会更新到"\"i\": 99" 或任何基于inputNum 的最后迭代数字。 JSON 文件也不像 JSON,它应该像这样的对象数组:

[{"i":1,"addedSum":2},{ "i":2,"addedSum":4 }]

这是我的代码。它可能有很多错误,这是我第一次尝试这样的事情,如果有点混乱,请道歉。

需要 fs 并使用 readFileSync():

var fs = require("fs");
const data = fs.readFileSync("sequence.json");
var numberCount = JSON.parse(data);
let numberObj = JSON.stringify(numberCount);

let inputNum = 100;

InitCount() 初始化计数并假设将iaddedSum 推送到我的“sequence.json”文件中。相反,它返回 NULL 的迭代,而我的 sequence.JSON 文件仅包含:"\"i\": 99"

const InitCount = (inputNum) => {
  for (let i = 0; i < inputNum; i++) {
    let addedSum = i + i;
    console.log(i);
    let data = JSON.stringify(`"i": ${i}`, `addedSum:${addedSum}`);

    fs.writeFile("sequence.json", data, finished);
    function finished(err) {
      console.log(err);
    }
  }
};

addCount() 应该查看“sequence.JSON”中的最后一个数字,如果 inputNum 大于数组中的最后一个数字,则继续计数。示例:如果数组为空,并且您输入 100,则 sequence.JSON 文件应反映 100 个对象。如果你然后输入 200,那么它的函数应该识别“sequence.json”数组中的最后一个数字,i,是 100,然后继续计数到 200,当然从 101 开始,然后将新数字添加并写入“sequence.JSON”。

function addCount(arr, inputNum) {
  let i = arr.length;
  for (i ? arr[i - 1].len + 1 : 0; i <= inputNum; i++) {
    let addedSum = i + i;
    let data = JSON.stringify(`"i": ${i}`, `addedSum:${addedSum}`);

    fs.writeFile("sequence.json", data, finished);
    function finished(err) {
      console.log(err);
    }
    addCount(numberObj, inputNum);
  }
}
return InitCount(inputNum);

更新:代码返回错误 Cannot read property 'readFile' of undefined

const fs = require("fs");

let inputNum = 200;

async function readSequenceJSON() {
  let data = await fs.promises.readFile("numberLine.json");
  return JSON.parse(data);
}

function writeSequenceJSON(data) {
  let str = JSON.stringify(data);
  return fs.promises.writefile("numberLine.json", str);
}

async function nextSequence(inputNum) {
  let data = await readSequenceJSON();

  for (let i = 0; i <= inputNum; i++) {
    const addedSum = i + i; 
    // only push numbers whose frequencies are "in bounds" of num
    if (frequency <= inputNum) {
      data.push({ i, addedSum });
    }
  }

  function addValues(data, inputNum) {
    for (
      let i = data.length ? data[data.length - 1].i + 1 : 0;
      i <= inputNum;
      i++
    ) {
      const addedSum = i + i;
      data.push({ i, addedSum });
    }
  }

【问题讨论】:

    标签: javascript node.js arrays json


    【解决方案1】:

    您的for 循环正在尝试启动一大堆fs.writeFile() 操作,以便它们都试图同时写入文件。这显然会导致问题和冲突。在一个循环中对同一个文件反复调用fs.writeFile() 并没有真正的意义,因为每次新的写入只会覆盖之前写入的内容,即使您一次对它们进行排序。

    此外,您将两个字符串传递给JSON.stringify(),其中第二个字符串将被解释为应该是函数或数组的替换器,但您传递的是字符串。所以,这也没有意义。

    然后,您似乎一直在递归调用addCount()。这也没有意义。

    老实说,我无法准确地告诉您要使用您的 sequence.json 文件完成什么,因此我将提供一个关于向该序列写入新项目的小教程。

    假设您有一个 sequence.json,最初包含:

    [{"i":1,"addedSum":2}]
    

    并且,您希望在该数组中找到最后一个 iaddedSum 值并创建序列中的下一项。为此,您需要执行以下步骤:

    1. 读入现有的 JSON
    2. 将其解析为 Javascript 对象
    3. 将其用作 Javascript,获取数组中的最后一项并查看其中的 iaddedSum 值。
    4. 创建要添加到数组末尾的新对象并将其添加到数组中
    5. 将修改后的数组转换为 JSON 并写入您的文件。

    代码在这里:

    async function readSequenceJSON() {
         let data = await fs.promises.readFile('sequence.json');
         return JSON.parse(data);
    }
    
    function writeSequenceJSON(data) {
         let str = JSON.stringify(data);
         return fs.promises.writeFile('sequence.json', str);
    }
    
    async function nextSequence(input) {
          let data = await readSequenceJSON();
    
          // do some processing of data here to possibly add a new item
          // insert your code here, data is a Javascript object (no JSON)
          // data[data.length - 1] references the last object in the array
          // if that is key to your processing
    
          return writeSequenceJSON(data);
    }
    
    // how to call it
    nextSequence(someInput).then(() => {
        console.log("all done");
    }).catch(err => {
        console.log(err);
    });
    

    【讨论】:

    • 我试图实现上面的解决方案代码,如何将项目推送到我的 JSON?我习惯了 .push() 之类的 javascript 数组方法,所以我不确定如何使用这种方法。谢谢!
    • @KingMuze - 在nextSequence() 内部,在readSequence() 代码行之后,data 只是一个数组,所以您只需执行data.push(...)
    • 我在尝试推送数据时在控制台中收到此错误。 TypeError: Found non-callable @@iterator at nextSequence (/Users/javontaymcelroy/Documents/initCount.js:21:12) 这是那行代码: for (let i = 0; i
    • 通过将添加的 str 转换为我的推送来解决该问题。但是现在出现这个错误:TypeError: object is not iterable (cannot read property Symbol(Symbol.iterator))
    • @KingMuze - 正确的拼写是fs.promises.writeFile。这是我的回答中的一个错字(我已更正)。
    猜你喜欢
    • 2017-09-14
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    • 2017-06-15
    • 2019-11-04
    相关资源
    最近更新 更多