🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

789閲覧

JSでfsを使い、辞書の内容を追加する方法について

ryoooos

総合スコア11

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2019/11/25 23:22

前提・実現したいこと

配列の中にオブジェクトを追加していくテキストファイルを実装したいと思っています。
具体例は

[ { "private key": private_key, "public key" : public_key } { "private key": private_key, "public key" : public_key } : ]

発生している問題・エラーメッセージ

しかし、実際のテキストファイルの出力は

{"private key":4jt4q..... ,"public key":54321f4ddg.....}

となり、ファイルを書きこむと辞書の内容が更新されてしまい、別の辞書を追加することが出来ていません。

該当のソースコード

javascript

1const bitcoinjs = require("bitcoinjs-lib") 2const crypto = require("crypto") 3const base58Check = require("bs58check") 4const fs = require("fs") 5 6let random1 = crypto.randomBytes(32) 7let ECPair = bitcoinjs.ECPair.fromPrivateKey(random1,{compressed:false}) 8 9let private_key = ECPair.privateKey.toString("hex") 10let public_key = ECPair.publicKey.toString("hex") 11 12function Key_file(private_key,public_key) { 13 const key_list = { 14 "Private Key": private_key, 15 "Public Key": public_key, 16 } 17 18 const jsonString = JSON.stringify(key_list) 19 const jsonBuffer = Buffer.from(jsonString,"utf8") 20 fs.writeFileSync("key.txt",jsonBuffer) 21 22 23} 24 25Key_file(private_key,public_key)

試したこと

fs.writeFileSync("key.txt",jsonBuffer)の後ろに辞書を再び作ったり、fs.readFileSyncを追加したりしました。

よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

ファイルを書きこむと辞書の内容が更新されてしまい、別の辞書を追加することが出来ていません。

常に上書き保存するコードだからです。
ファイル操作の基本は「読み、書き、保存」です。

javascript

1// NodeJS 2 3const fs = require("fs") 4const file = "key.txt"; 5 6function loadJson( filepath ) { 7 let jsonText; 8 if( fs.statSync( filepath ).isFile() ) { 9 jsonText = fs.readFileSync( filepath, "utf8" ); 10 } 11 return jsonText ? JSON.parse(jsonText) : ""; 12} 13 14function saveJson( filepath, json ) { 15 let jsonText = JSON.stringify(json); 16 fs.writeFileSync( filepath, jsonText, "utf8" ); 17} 18 19function Key_file(private_key,public_key) { 20 // 読み:ファイルを読んで内容を取得 21 let ary = loadJson( file )||[]; 22 23 // 書き:内容を更新 24 ary.push({ /* omitted */ }); 25 26 // 保存:更新内容を上書き保存 27 saveJson( file, ary ); 28}

追記)上記コードは NodeJS の以下の 同期関数で表現してみました。

なお、パフォーマンスを求めるなら、更に考える必要があります。

  • 他のロジックを考える
  • ファイルの代わりに DB にする。
  • RAMドライブを導入し高速化&定期バックアップする。

(揮発性のメインメモリの一部をドライブ化するとデータ喪失しやすい)

  • etc

投稿2019/11/26 06:01

編集2019/11/26 07:19
AkitoshiManabe

総合スコア5434

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ryoooos

2019/11/27 06:23

丁寧にコードまで書いていただき、ありがとうございます! ブロックチェーンに興味があり、Node.jsをやり始めましたが、やはり体系的に学ばなければダメですね。 ファイルの使い方も含め、Node.jsの基礎本を読み、勉強していきます。 また、機会があればよろしくお願いします!
guest

0

fs.readFileを用いてファイルを取得し
その取得したデーターに新しいデーターを追加(push)してから保存するとできると思います

投稿2019/11/26 00:01

mouse_484

総合スコア759

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ryoooos

2019/11/26 00:32

ご回答ありがとうございます pushを使用して修正しました。 配列(key_list)を定義しておかないと、undifinedとなり、エラーになりますが、 ``` fs.writeFileSync("key.txt",key_list) key_list.push({ "private" : private_key, "public": public_key }) fs.readFileSync("key.txt",key_list) ``` 事前に配列を定義しておくと、配列が空の状態がファイルに書き込まれて、pushが機能しません。 ``` key_list=[] fs.writeFileSync("key.txt",key_list) key_list.push({ "private" : private_key, "public": public_key }) fs.readFileSync("key.txt",key_list) ``` この点はどう対処すればよろしいでしょうか?
mouse_484

2019/11/26 00:37

配列であればpushですが単純に前の文字列+新しいをファイルに保存で良いとおもいます(txtファイルなようなので)
ryoooos

2019/11/26 00:57

ありがとうございます。 文字列がテキストファイルに保存されません。 以下のコードの理解に誤りがあれば教えてください。 ``` fs.writeFileSync("key.txt") ここでテキストファイルを作成 const key_list = [] 空の配列を作成 key_list.push({ "private" : private_key, "public": public_key }) 配列に辞書を追加 fs.readFileSync("key.txt",key_list) key_listが追加された状態でファイルの保存 ```
mouse_484

2019/11/26 01:01

readは読む方ですよ? writeが書き込む方で逆です
ryoooos

2019/11/26 01:16

ありがとうございます。 writeとreadを入れ換えて、出力すると、[object object]となりました。 配列をバイナリデータに変換する必要があると思い、以下のように変更しましたが、出力は変わりませんでした。何が原因でしょうか。 ``` fs.readFileSync("key.txt") const key_list = [] Buffer.from(JSON.stringify(key_list.push({ "private" : private_key, "public": public_key }))) fs.writeFileSync("key.txt",key_list) ```
mouse_484

2019/11/26 01:19

そのコードから先程まで言っていた事が何も反映されていないのですが...? またjson形式で保存するならkey.jsonなどにして fsでjsonを扱う方法を調べて実装してください
ryoooos

2019/11/26 01:27

もう少しfsについて調べてみようと思います。 この度は、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問