回答編集履歴

2

追記2

2020/11/29 23:43

投稿

gpsoft
gpsoft

スコア1323

test CHANGED
@@ -169,3 +169,43 @@
169
169
  const h = '<p>'+v.uname+'<br>'+v.text+'<br>'+time+'</p>';
170
170
 
171
171
  ```
172
+
173
+
174
+
175
+
176
+
177
+ # 追記2
178
+
179
+
180
+
181
+ ### 改良点3
182
+
183
+
184
+
185
+ このアプリを作るときに、Firebaseにログインして、データベースの新規作成などを実行したと思います。そのとき、データベースのフィールドとして、
186
+
187
+
188
+
189
+ - `uname`という名前の、テキスト文字列型のフィールド
190
+
191
+ - `text`という名前の、テキスト文字列型のフィールド
192
+
193
+
194
+
195
+ を登録した記憶はありませんか?
196
+
197
+
198
+
199
+ もしあるなら、そこに
200
+
201
+
202
+
203
+ - `timestamp`という名前の、整数型のフィールド
204
+
205
+
206
+
207
+ を追加してみてください。
208
+
209
+
210
+
211
+ ※私自身はFirebaseを使ったことがないので、ゴールまで少々遠回りしてると思いますが、ご容赦ください。

1

より丁寧に解説

2020/11/29 23:43

投稿

gpsoft
gpsoft

スコア1323

test CHANGED
@@ -11,3 +11,161 @@
11
11
 
12
12
 
13
13
  もしそうなら、それを使って`h`を組み立てれば良いと思います。
14
+
15
+
16
+
17
+ # 追記
18
+
19
+
20
+
21
+ このチャットアプリの流れを、想像も踏まえて書いてみます。
22
+
23
+
24
+
25
+ ※なお、ここでは「フィールド」をFirebase上でのデータの項目名のような意味で使っています。画面の入力欄という意味ではないです。
26
+
27
+
28
+
29
+ ### 投稿処理
30
+
31
+
32
+
33
+ (1)
34
+
35
+ ブラウザ画面に、名前とメッセージの入力欄が表示される。
36
+
37
+
38
+
39
+ (2)
40
+
41
+ ユーザが、名前とメッセージを入力して、「投稿する」ボタンを押す。
42
+
43
+
44
+
45
+ (3)
46
+
47
+ Javascriptで、入力欄の内容を読み取り、それをサーバ(Firebase)へ送信する。
48
+
49
+
50
+
51
+ このとき、名前は`uname`フィールド、メッセージは`text`フィールドとして
52
+
53
+ Firebaseへ送信している。
54
+
55
+
56
+
57
+ ### 投稿一覧表示処理
58
+
59
+
60
+
61
+ (4)
62
+
63
+ 新しい投稿が登録されたり、画面を再描画したとき、
64
+
65
+ Firebaseから`child_added`イベントが届く。
66
+
67
+
68
+
69
+ 1つの投稿につき、1つのイベントが届く。
70
+
71
+
72
+
73
+ (5)
74
+
75
+ イベントデータ`data`から、Firebaseに登録された投稿データの、
76
+
77
+ 各フィールド(`uname`や`text`)の値を取り出すことができるので、
78
+
79
+ それをHTMLタグに加工して画面に出力する。
80
+
81
+
82
+
83
+ ### 改良点1
84
+
85
+
86
+
87
+ (3)のところで、`uname`と`text`に加えて、
88
+
89
+ 「投稿日時」を表すフィールド`timestamp`も
90
+
91
+ Firebaseへ送信するようにしましょう。
92
+
93
+
94
+
95
+ この「投稿日時」は、ユーザに入力してもらう情報ではありません。
96
+
97
+ Javascriptで`new Date()`すれば、得られます。
98
+
99
+
100
+
101
+ ただし、Javascriptの`Date`オブジェクトをFirebaseに登録することは、できないかもしれませんので、数値に変換して送信しましょう。
102
+
103
+
104
+
105
+ ```javascript
106
+
107
+ var now = new Date().getTime(); // 現在日時を数値に変換
108
+
109
+
110
+
111
+ // Firebaseへ送信
112
+
113
+ ref.push({
114
+
115
+ uname: ...
116
+
117
+ text: ...
118
+
119
+ timestamp: now // ←ここ
120
+
121
+ }, .....
122
+
123
+ ```
124
+
125
+
126
+
127
+ ### 改良点2
128
+
129
+
130
+
131
+ (5)のところでは、`uname`と`text`に加えて、
132
+
133
+ `timestamp`フィールドの値も取り出し、画面に出力しましょう。
134
+
135
+
136
+
137
+ これは、おそらく、
138
+
139
+ 質問文の「//受信する際のコード」に書いてあるコードに、1行追加するだけでOKです。
140
+
141
+
142
+
143
+ ```javascript
144
+
145
+ ref.on("child_added",function(data){
146
+
147
+ const v = data.val();
148
+
149
+ const k = data.key;
150
+
151
+
152
+
153
+ var date = new Date();
154
+
155
+ date.setTime(v.timestamp); // ←ここ
156
+
157
+ var month = date.getMonth() + 1;
158
+
159
+ var day = date.getDate();
160
+
161
+ var hours = date.getHours();
162
+
163
+ var minutes = date.getMinutes();
164
+
165
+ var time = (time = month + "/" + day + " " + hours + ":" + minutes);
166
+
167
+
168
+
169
+ const h = '<p>'+v.uname+'<br>'+v.text+'<br>'+time+'</p>';
170
+
171
+ ```