2017-07-10 7 views
0

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")を実行すると、オブジェクトが1つしかない配列が得られます。アレイ。アプリを実行すると、配列内の別のアイテムを置き換える代わりに、別のオブジェクトを配列に追加するようにするにはどうすればよいですか。

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

functions.jsは常に 'items'を' entries.json'にあるものに初期化するべきではありませんか? – nnnnnn

+0

ファイル内の内容をまず読んで構文解析し、その配列の項目を追加してから、その配列を書き出す必要があります。 JSONを含むファイルの末尾にインクリメンタルに追加することはできません。そうした場合、有効なJSONにはなりません。あなたのコードは今のところ、新しい配列を作成して、それに1つの項目を追加し、ファイルの内容全体として書き込むだけです。したがって、配列には常に1つの項目が含まれています。以前はファイル内の配列にあったものを上書きします。 – jfriend00

答えて

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

パラメータのデフォルト値はfs.writeFileSyncになり、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)のいずれかであるため、ファイル内の最新の項目のみが表示されます。以前に記述されたコンポーネントを保存するには、ファイルに追加する必要があります。これはaoptions.flagとして渡すことで可能です。

関連する問題