节点 - 将对象推送到数组会替换第一个项目

时间:2017-07-10 03:23:39

标签: javascript arrays node.js

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时将新对象推送到数组项中。当我在命令提示符下运行文件(节点app.js --title =" testing" --city =" Windsor")时,我得到的数组只有一个对象而我发现它一直在替换数组的第一项。我如何得到它,以便当应用程序运行时,它将另一个对象添加到数组而不是替换数组中的另一个项目。

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

2 个答案:

答案 0 :(得分:0)

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');

答案 1 :(得分:0)

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