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

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

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

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

Q&A

解決済

2回答

311閲覧

node.jsとjsonファイルとの連携がうまくいきません

Izumo1101

総合スコア49

Node.js

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

0グッド

0クリップ

投稿2020/04/02 07:32

編集2020/04/02 08:21

独学で勉強しています。小規模システムをイメージして、チャットアプリを作ろうとしています。メッセージ等をDBに保存したいのですが、mongoDB等の前にjsonファイルへの書き込み、呼び出しをしようと試行しています。

NewChat
|_node_modulesフォルダ
|_chat.js
|_index.html
|_package-lock.json
|_database.json
チャット機能自体は正常に動いています。そこでユーザーが入室時にユーザーネームを入力するので、まずはその名前をdatabase.jsonにpushしようと考えました。以下はテンプレートだけ作成したdatabase.json

json

1 { 2 "id":"あんじ", 3 },

正常に動いていたファイルに追記したのは、上部の
var fs = require("fs");
var database = fs.readFileSync("database.json" , "utf-8");
に加え、「ここから追記 ここまで追記」の箇所になります。

js

1var app = require('express')();//expressを使うため 2var http = require('http').Server(app);//expressを使って通信を扱う 3var io = require('socket.io')(http);//socketを使うため 4var POST = 1234;//localhost:3000 5var fs = require("fs"); 6var database = fs.readFileSync("database.json" , "utf-8"); 7 8 9//ルートディレクトリにアクセスした時に動く処理 10app.get('/', function(req, res) { 11 //index.htmlにリダイレクトする 12 res.sendFile(__dirname + '/index.html'); 13}); 14 15//socket.ioに接続された時に動く処理 16io.on('connection', function(socket) { 17 18 19 socket.on('setUserName', function (userName) { 20 if(!userName) userName = '匿名'; 21 22 socket.userName = userName; 23 io.emit('message', socket.userName + 'さんが入室しました!', 'System'); 24 }); 25 console.log('入室したユーザー : %s', socket.userName); 26  //ここから追記 27 database = JSON.parse(database); 28 database.push({id:"socket.userName"}); 29 fs.writeFileSync(database.json,JSON.stringify(database)); 30 //ここまで追記 31 32 //接続時に振られた一意のIDをコンソールに表示 33 console.log('入室したID : %s', socket.id); 34 //接続時に全員にIDを表示(messageというイベントでクライアント側とやりとりする) 35 36 37 //messageイベントで動く 38 //全員に取得したメッセージとIDを表示 39 socket.on('message', function(msj) { 40 io.emit('message', msj, socket.userName); 41 }); 42 43 //接続が切れた時に動く 44 //接続が切れたIDを全員に表示 45 socket.on('disconnect', function(e) { 46 console.log('接続が切れたID : %s', socket.userName); 47 }); 48}); 49 50//接続待ち状態になる 51http.listen(POST, function() { 52 console.log('接続開始', POST); 53});

ユーザーに名前を問うウィンドウが出されるタイミングでコンソールに以下が表示されます。

cmd

1接続開始 1234 2入室したユーザー : undefined 3undefined:4 4 }, 5 ^ 6 7SyntaxError: Unexpected token } in JSON at position 22 8 at JSON.parse (<anonymous>) 9 at Namespace.<anonymous> (C:\Users\annji\Desktop\NewChat\chat.js:27:19) 10 at Namespace.emit (events.js:189:13) 11 at Namespace.emit (C:\Users\annji\Desktop\NewChat\node_modules\socket.io\lib\namespace.js:213:10) 12 at C:\Users\annji\Desktop\NewChat\node_modules\socket.io\lib\namespace.js:181:14 13 at process._tickCallback (internal/process/next_tick.js:61:11)

参考になせていただいたのは
https://ex-script.com/?p=377
こちらで、}系の綴り間違いかと何度か確かめましたが該当しないように思われます。

どなたか間違いをご教示いただけると助かります。


お答えいただきました方、ご回答ありがとうございます。
投稿直後に私も思いまして、コンマを外しましたが違うエラーが出てしまいました。

json

1 { 2 "id":"りんご" 3 }

cmd

1接続開始 1234 2入室したユーザー : undefined 3C:\Users\annji\Desktop\NewChat\chat.js:28 4 database.push({id:"userName"}); 5 ^ 6 7TypeError: database.push is not a function 8 at Namespace.<anonymous> (C:\Users\annji\Desktop\NewChat\chat.js:28:12) 9 at Namespace.emit (events.js:189:13) 10 at Namespace.emit (C:\Users\annji\Desktop\NewChat\node_modules\socket.io\lib\namespace.js:213:10) 11 at C:\Users\annji\Desktop\NewChat\node_modules\socket.io\lib\namespace.js:181:14 12 at process._tickCallback (internal/process/next_tick.js:61:11) 13コード

何度もすみません。
fs.writeFileSync('database.json',JSON.stringify(database));
ファイルのコーテーションも試しましたが同様でした。

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

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

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

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

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

guest

回答2

0

ベストアンサー

TypeError: database.push is not a function

database.jsonは配列ではなく普通のオブジェクトです。よって変数databaseも普通のオブジェクトなので、pushメソッドはありません。

database.push({id:"socket.userName"});

とありますが、これはどういう意図でしょうか?database"id":"りんご"というプロパティと、"id":"socket.userName"というプロパティが両方存在してほしいということでしょうか?

また、予想ですが、"socket.userName"という文字列を指定したいわけではなく、ユーザー名を指定したいと思うので、{id:"socket.userName"}ではなく{id: socket.userName}だと思います。

投稿2020/04/02 08:41

karamarimo

総合スコア2551

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

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

Izumo1101

2020/04/02 09:20

ご回答ありがとうございます。 オブジェクトからデータを取り出し、ここにプッシュする。 { "items" : [ {"id":"りんご"},   {"id":"みかん"} ] } ここにユーザーネームをpushする。 var obj = JSON.parse(database); var items = obj.items; var i; var item; var id; for (i in items) { item = items[i]; id = item.id; console.log(id); } items.push({id: socket.userName}); console.log(items); 確かにここでいうitemsに追記されました。 もしよければ・・・ですが、これをまたjsonに返す方法を(方向性だけでも)教えていただけると嬉しいです。
karamarimo

2020/04/02 09:58 編集

そのまま fs.writeFileSync('database.json',JSON.stringify(database)); ではうまくいきませんでしたか? 修正: クォーテーション
Izumo1101

2020/04/02 09:53

obj.items.push({id: socket.userName}); fs.writeFileSync('database.json', JSON.stringify(obj)); 読み込みのテストのためにitemsという余計な見出しを付けちゃいまして。勉強のためにはそっちが良いかと思い試行していました。 解決できました。ありがとうございます。
guest

0

JSON ファイルの記述が間違っています。

コンマ(,)があると、必ず何かしらのデータが続くものとして解釈するノーテーションの仕様があります。

database.json

Json

1{ 2 "id":"あんじ" 3}

投稿2020/04/02 07:54

AkitoshiManabe

総合スコア5432

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

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

Izumo1101

2020/04/02 08:09

ありがとうございます。 投稿直後に思い当って試行したのですが今度は違うエラーが出てしまいまいした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問