独学で勉強しています。小規模システムをイメージして、チャットアプリを作ろうとしています。メッセージ等を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));
ファイルのコーテーションも試しましたが同様でした。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/02 09:20
2020/04/02 09:58 編集
2020/04/02 09:53