【问题标题】:Node - pushing an object to an array replaces the first item节点 - 将对象推送到数组替换第一项
【发布时间】:2017-12-13 16:12:03
【问题描述】:

functions.js:

const fs = require("fs");


var items = [];
var addItem = (name, city) => {
    var item = {
        name,
        city
    };
    console.log(items)
    items.push(item)
    fs.writeFileSync("entries.json", JSON.stringify(items))
};
module.exports = {
    addItem
};

app.js:

const yargs = require("yargs");
const request = require("request");

const ext = require("./functions.js");

var argv = yargs
    .options({
        name:{
            demand:true,
            string:true,
            describe:"Enter your name.  "
        },
        city:{
            demand:true,
            string:true,
            describe:"Enter the city you live in.  "
        }
    })
    .help()
    .argv
var inputName = argv.name;
var inputCity = argv.city;

ext.addItem(inputName, inputCity);

我要做的是在每次运行其他文件 app.js 时将一个新对象推送到数组项中。当我在命令提示符下运行文件 (node app.js --title="testing" --city="Windsor") 时,我得到的数组只有一个对象,我发现它一直在替换大批。如何获取它,以便在应用程序运行时,它将另一个对象添加到数组中,而不是替换数组中的另一个项目。

[{"name":"aasdasdsdasd","city":"sdasdassddaasdasdasdsdn"}]

【问题讨论】:

  • 不应该 functions.js 将 items 初始化为 entries.json 中的任何内容,而不是始终初始化为空数组?
  • 您必须首先读取文件中的内容,对其进行解析,然后添加该数组的项目,然后将该数组写出。您不能增量添加到包含 JSON 的文件的末尾 - 如果您这样做,它将不是有效的 JSON。就您现在的代码而言,您只是在创建一个新数组,向其中添加一项并将其作为文件的全部内容写入,因此数组始终只包含一项也就不足为奇了。您总是会覆盖文件中数组中以前的内容。

标签: javascript arrays node.js


【解决方案1】:

items 数组正在初始化一个空数组...

我认为您需要在将新对象推入其中之前阅读它,例如(未经测试):

const fs = require("fs");

function addItem(name, city) {
    var item = {
        name,
        city
    };
    fs.readFileSync("entries.json", "utf8", function(err, data) {
        if (err) throw err;
        var items = JSON.parse(data);
        items.push(item);
        fs.writeFileSync("entries.json", JSON.stringify(items))
     });
}

或者,您可以在顶部使用require 加载它:

const items = require('entries.json');

【讨论】:

    【解决方案2】:

    传递给fs.writeFileSyncoptions.flag 参数的默认值为w。此选项为creates (if it does not exist) or truncates (if it exists) (https://nodejs.org/api/fs.html#fs_fs_open_path_flags_mode_callback),因此您只能看到文件中的最新项目。为了保留以前编写的组件,您需要附加到文件中。这可以通过将a 传递为options.flag 来完成。

    【讨论】:

      猜你喜欢
      • 2021-11-13
      • 2017-05-29
      • 1970-01-01
      • 1970-01-01
      • 2019-04-08
      • 1970-01-01
      • 2021-07-20
      • 2021-12-28
      相关资源
      最近更新 更多