質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Node.js

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

JavaScript

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

Q&A

解決済

4回答

3271閲覧

node.jsでjsonファイルにデータを追加したい

HSDxD_official

総合スコア15

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Node.js

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

JavaScript

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

0グッド

0クリップ

投稿2019/01/17 15:02

fsでjsonファイルのデータを読み込んでいます。

javascript

1var db = fs.readFileSync("./database.json", "utf-8"); 2var read_db = JSON.parse(db);

jsonの内容は以下のようなかんじです。

json

1[ 2 { 3 "ip": null, 4 "user": "test1", 5 "coins": 400, 6 "comment": null 7 }, 8 { 9 "ip": null, 10 "user": "test2", 11 "coins": 500, 12 "comment": null 13 } 14]

外部から接続があった場合、
送られてきたデータとuserが一致するかどうかで分岐するというプログラムを作ったのですが
もしどれとも一致しない内容が来た場合に自動的にjsonにそのデータを追加して保存したいのです。

例えばjsonが上のような内容だったときtest3という内容が送られてきたら、
test1ともtest2とも一致しないので

json

1[ 2 { 3 "ip": null, 4 "user": "test1", 5 "coins": 400, 6 "comment": null 7 }, 8 { 9 "ip": null, 10 "user": "test2", 11 "coins": 500, 12 "comment": null 13 }, 14 { 15 "ip": null, 16 "user": "test3", 17 "coins": 100, 18 "comment": null 19 } 20]

というかんじにデータを追加して保存したいと考えています。

データの追加方法などは調べてみて、挑戦したのですがうまくいきませんでした。

もしよろしければ どのようにすれば上手くいくか教えていただけないでしょうか?
よろしくお願いします。

もし情報不足であればご指摘ください。

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

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

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

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

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

guest

回答4

0

自己解決

今回はjsonを読み込んだものに追加したいデータをpushして、書き込みをするというのを試したら解決しました!

javascript

1global.json_corrector = require("json-pretty"); 2----------------------------------------------------- 3fs.writeFileSync("./database.json", global.json_corrector(added_db))

書き込みは上記のようなかんじです。

お二人に指摘されたように今後はちゃんとしたデータベースを利用するようにします。

投稿2019/01/17 21:52

HSDxD_official

総合スコア15

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

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

0

データの追加方法などは調べてみて、挑戦したのですがうまくいきませんでした。

Node

1var db = fs.readFileSync("./database.json", "utf-8"); 2var read_db = JSON.parse(db); 3 4read_db.push({ 5 ip: null, 6 user: "test3", 7 coins: 100, 8 comment: null 9}); 10 11// JSON.stringifyあるからjson-prettyなるライブラリは不要 12// 人が読む場合JSON.stringify(値, null, 2)にするのが一般的だが速度が落ちる 13fs.writeFileSync("./database.json", JSON.stringify(read_db));

全体的な戦略

まぁ、そういうサーバーって基本的に落とさないですし、
落ちてデータがおじゃんになっても「そっかーしょうがないね」で済ませるようなデータを置いておくに留める構成が一般的でしょうね。

ですので下記のようにMapやオブジェクトのキーをIDにして持たせた変数を一個用意しておく設計にしておくのが良いでしょう。

Node.jsのプロセスが死んだら困る〜や、複数台でログイン状態を管理したい〜
…といった要望があるなら、Redisサーバを検討すると良いでしょう。

Redisサーバはキーバリューストアというジャンルのデータベースです。

キーにした文字列を渡すと瞬時に結果が帰ってきます。
ユーザーIDで見張りたいならユーザーIDをキーに情報を蓄えましょう。
検索して結果が帰ってきたらログイン中、
結果が帰って来なければ初回アクセスとして処理みたいな動作にすればやりたい事が簡単に実現出来るでしょう。

当然、JSONファイルを毎回全部読み出して、
全部書き込むとかいうクソみたいな運用とは速度面で雲泥の差がありますし、
Redisサーバは可用性も高く、うさぎのように速いですが途中で寝転がったりしません。

投稿2019/01/18 03:24

miyabi-sun

総合スコア21158

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

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

HSDxD_official

2019/01/18 17:31

JSON.stringifyでよかったんですね。 私はプログラム初心者なのでforやifでユーザーの識別ができることに感動していました笑 でもやっぱり毎回全部読むのはよくないですよね Redis、調べてみます。ありがとうございます。
guest

0

データ構造が array だったら特定のユーザデータを取得するために毎回全件調べないといけないです。
なのでこれは user.id をキーとした object にした方が良いと思います。

新 database.json

{ "test1": { "id": "test1" }, "test2": { "id": "test2" } }

database.json への読み書きは、なんかこんな感じでいけるかと。

const fs = require('fs') const addUser = (user) => { const db = require('./database.json') // 実はこれで読める if (!db[user.id]) { db[user.id] = user fs.writeFileSync(__dirname + '/database.json', JSON.stringify(db, null, 2)) } } addUser({id: 'test1'}) addUser({id: 'test2'}) addUser({id: 'test3'})

非同期処理がなく、また node.js はイベントループなので、あるアクセスのために read してから write するまでの間に別のアクセスがあり read されて、前者の編集内容が消える…みたいなケースは起きないかとは思います。
が、毎回 database の中身を全件読み出して全件書き出してるっていうことなので、データが大きくなってくると disk io がボトルネックになり、スループットとレイテンシが悪化します。
あと試せてないですが writeFileSync 中にプロセスが終了すると、 database 全体が破損する気もします。
ちゃんとしたデータベース使ったほうが心配事は少ないですね。

投稿2019/01/17 17:08

set0gut1

総合スコア2413

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

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

HSDxD_official

2019/01/17 21:44

なるほど、そんなやり方もありましたか!
guest

0

そもそもjsonをDB代わりに使おうとしているのが正直微妙な気がしている...
ましてや見たところユーザー情報だし...
IP がユーザー識別のプライマリキーになってるようですが同じIPで別ユーザーの場合はどうする感じでしょうか?

一応json をDB代わりに使えるライブラリはあるみたいですが、別の方法を検討した方がいい気がします。
https://www.npmjs.com/package/node-json-db

投稿2019/01/17 15:22

trewa-nek9585

総合スコア116

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

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

HSDxD_official

2019/01/17 15:52

クライアントでUserIDが自動生成されて識別は送られてくるUserID(user)でしています。 IPとUserIDが一致するかどうかにしようと思ったのですが、テスト中なのでUserIDのみを使用しています。 単に接続してきたユーザーを識別したいという目的です。 リンク拝見させていただきます。
miyabi-sun

2019/01/18 03:10

まぁRedisでやれ案件ですね。 Redisならデータの生存時間の設定も出来るので30分操作がなかったユーザは勝手にログアウトさせるみたいなことも可能ですからね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問