質問編集履歴
21
誤植の修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -286,8 +286,8 @@
|
|
286
286
|
こちらの投稿にて同時に質問していた「PostgreSQLの生成列でTo_charを使いたい」という問題は、本題がふたつ存在したことで分かり辛くなってしまったため、別の投稿に移動いたしました。
|
287
287
|
https://teratail.com/questions/5xbktfa8l5dr0f
|
288
288
|
|
289
|
-
また、こちらの投稿ででいただいたアドバイス試したところ、出力結果に進歩が見られましたので、別の投稿に移動することになりました。続きはこちらをご覧いただければと思います。
|
289
|
+
また、こちらの投稿ででいただいたアドバイスを試してみたところ、出力結果に進歩が見られましたので、別の投稿に移動することになりました。続きはこちらをご覧いただければと思います。
|
290
|
-
https://teratail.com/questions/
|
290
|
+
https://teratail.com/questions/2k3v2jas7rn82h
|
291
291
|
|
292
292
|
お付き合いいただいている皆様にはご不便をおかけしてしまい、誠に申し訳ございません。
|
293
293
|
|
20
情報の更新
test
CHANGED
File without changes
|
test
CHANGED
@@ -286,5 +286,8 @@
|
|
286
286
|
こちらの投稿にて同時に質問していた「PostgreSQLの生成列でTo_charを使いたい」という問題は、本題がふたつ存在したことで分かり辛くなってしまったため、別の投稿に移動いたしました。
|
287
287
|
https://teratail.com/questions/5xbktfa8l5dr0f
|
288
288
|
|
289
|
+
また、こちらの投稿ででいただいたアドバイス試したところ、出力結果に進歩が見られましたので、別の投稿に移動することになりました。続きはこちらをご覧いただければと思います。
|
290
|
+
https://teratail.com/questions/6zqnuiwft1zlkp
|
291
|
+
|
289
292
|
お付き合いいただいている皆様にはご不便をおかけしてしまい、誠に申し訳ございません。
|
290
293
|
|
19
質問を以前の状態に戻しました
test
CHANGED
File without changes
|
test
CHANGED
@@ -5,30 +5,124 @@
|
|
5
5
|
それに伴い、お尋ねしたい問題がございます。
|
6
6
|
|
7
7
|
### PostgreSQLと既存のコードが噛み合わない
|
8
|
-
移行にあたり必要なコードの書き換えなどは一通り終えたつもりなのですが、実行してみたところ、EJSファイルに次のようなエラーが発生してしまい
|
9
|
-
|
10
|
-
```app.jsの実行結果
|
11
|
-
Listeninng on 8001
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
i
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
8
|
+
移行にあたり必要なコードの書き換えなどは一通り終えたつもりなのですが、実行してみたところ、EJSファイルに次のようなエラーが発生してしまいました(EJSというのは、HTML内にJavascriptを簡単に記述できるJSのテンプレートエンジンです)。
|
9
|
+
|
10
|
+
```app.jsの実行結果
|
11
|
+
Listeninng on 8001
|
12
|
+
Result {
|
13
|
+
command: 'SELECT',
|
14
|
+
rowCount: 1,
|
15
|
+
oid: null,
|
16
|
+
rows: [
|
17
|
+
{
|
18
|
+
id: 1,
|
19
|
+
title: 'mikan',
|
20
|
+
content: 'choco',
|
21
|
+
created: 2023-12-01T07:16:14.517Z,
|
22
|
+
modified: 2023-12-01T07:18:47.483Z,
|
23
|
+
is_removed: false,
|
24
|
+
is_locked: false
|
25
|
+
}
|
26
|
+
],
|
27
|
+
fields: [
|
28
|
+
Field {
|
29
|
+
name: 'id',
|
30
|
+
tableID: 16399,
|
31
|
+
columnID: 1,
|
32
|
+
dataTypeID: 23,
|
33
|
+
dataTypeSize: 4,
|
34
|
+
dataTypeModifier: -1,
|
35
|
+
format: 'text'
|
36
|
+
},
|
37
|
+
Field {
|
38
|
+
name: 'title',
|
39
|
+
tableID: 16399,
|
40
|
+
columnID: 2,
|
41
|
+
dataTypeID: 1043,
|
42
|
+
dataTypeSize: -1,
|
43
|
+
dataTypeModifier: 44,
|
44
|
+
format: 'text'
|
45
|
+
},
|
46
|
+
Field {
|
47
|
+
name: 'content',
|
48
|
+
tableID: 16399,
|
49
|
+
columnID: 3,
|
50
|
+
dataTypeID: 1043,
|
51
|
+
dataTypeSize: -1,
|
52
|
+
dataTypeModifier: 10485764,
|
53
|
+
format: 'text'
|
54
|
+
},
|
55
|
+
Field {
|
56
|
+
name: 'created',
|
57
|
+
tableID: 16399,
|
58
|
+
columnID: 4,
|
59
|
+
dataTypeID: 1114,
|
60
|
+
dataTypeSize: 8,
|
61
|
+
dataTypeModifier: -1,
|
62
|
+
format: 'text'
|
63
|
+
},
|
64
|
+
Field {
|
65
|
+
name: 'modified',
|
66
|
+
tableID: 16399,
|
67
|
+
columnID: 5,
|
68
|
+
dataTypeID: 1114,
|
69
|
+
dataTypeSize: 8,
|
70
|
+
dataTypeModifier: -1,
|
71
|
+
format: 'text'
|
72
|
+
},
|
73
|
+
Field {
|
74
|
+
name: 'is_removed',
|
75
|
+
tableID: 16399,
|
76
|
+
columnID: 6,
|
77
|
+
dataTypeID: 16,
|
78
|
+
dataTypeSize: 1,
|
79
|
+
dataTypeModifier: -1,
|
80
|
+
format: 'text'
|
81
|
+
},
|
82
|
+
Field {
|
83
|
+
name: 'is_locked',
|
84
|
+
tableID: 16399,
|
85
|
+
columnID: 7,
|
86
|
+
dataTypeID: 16,
|
87
|
+
dataTypeSize: 1,
|
88
|
+
dataTypeModifier: -1,
|
89
|
+
format: 'text'
|
90
|
+
}
|
91
|
+
],
|
92
|
+
_parsers: [
|
93
|
+
[Function: parseInteger],
|
94
|
+
[Function: noParse],
|
95
|
+
[Function: noParse],
|
96
|
+
[Function: parseDate],
|
97
|
+
[Function: parseDate],
|
98
|
+
[Function: parseBool],
|
99
|
+
[Function: parseBool]
|
100
|
+
],
|
101
|
+
_types: TypeOverrides {
|
102
|
+
_types: {
|
103
|
+
getTypeParser: [Function: getTypeParser],
|
104
|
+
setTypeParser: [Function: setTypeParser],
|
105
|
+
arrayParser: [Object],
|
106
|
+
builtins: [Object]
|
107
|
+
RowCtor: null,
|
108
|
+
rowAsArray: false,
|
109
|
+
_prebuiltEmptyResultObject: {
|
110
|
+
>> 31| <% memos.forEach((memo) => { %>
|
111
|
+
32| <li>
|
112
|
+
33| <span class="title-column"><%= memo.title %></span>
|
113
|
+
34| <div class="items">
|
114
|
+
|
115
|
+
memos.forEach is not a function
|
116
|
+
at eval ("C:\\Users\\Kanon\\workspace\\memo-app\\views\\index.ejs":15:14)
|
117
|
+
at index (C:\Users\Kanon\workspace\memo-app\node_modules\ejs\lib\ejs.js:703:17)
|
118
|
+
at tryHandleCache (C:\Users\Kanon\workspace\memo-app\node_modules\ejs\lib\ejs.js:274:36)
|
119
|
+
at View.exports.renderFile [as engine] (C:\Users\Kanon\workspace\memo-app\node_modules\ejs\lib\ejs.js:491:10)
|
120
|
+
at View.render (C:\Users\Kanon\workspace\memo-app\node_modules\express\lib\view.js:135:8)
|
121
|
+
at tryRender (C:\Users\Kanon\workspace\memo-app\node_modules\express\lib\application.js:657:10)
|
122
|
+
at Function.render (C:\Users\Kanon\workspace\memo-app\node_modules\express\lib\application.js:609:3)
|
123
|
+
at ServerResponse.render (C:\Users\Kanon\workspace\memo-app\node_modules\express\lib\response.js:1039:7)
|
124
|
+
at Query.<anonymous> (C:\Users\Kanon\workspace\memo-app\app-new.js:20:8)
|
125
|
+
at Query.handleReadyForQuery (C:\Users\Kanon\workspace\memo-app\node_modules\pg\lib\query.js:139:14)
|
32
126
|
```
|
33
127
|
|
34
128
|
まだPosrgreSQLに不慣れなため、おそらく書き換えの際に書式の間違いや誤字が発生したのだと思いますが、自力ではこれ以上見つけることができず……。
|
@@ -55,7 +149,7 @@
|
|
55
149
|
update_tri BEFORE UPDATE ON memos FOR EACH ROW EXECUTE FUNCTION set_update_time()
|
56
150
|
```
|
57
151
|
|
58
|
-
```MySQL
|
152
|
+
```MySQL
|
59
153
|
mysql> desc memos;
|
60
154
|
+----------------+----------------+------+-----+-------------------+-----------------------------------------------+
|
61
155
|
| Field | Type | Null | Key | Default | Extra |
|
@@ -71,21 +165,16 @@
|
|
71
165
|
+----------------+----------------+------+-----+-------------------+-----------------------------------------------+
|
72
166
|
8 rows in set (0.05 sec)
|
73
167
|
```
|
74
|
-
|
168
|
+
_イタリックテキスト_
|
75
169
|
また、該当のJSファイルとEJSファイルはこちらです。
|
76
170
|
|
77
|
-
```app.js(
|
171
|
+
```app.js(/indexと周辺のみ)
|
78
172
|
const express = require('express');
|
79
173
|
const mod = require('./module')
|
80
174
|
const app = express();
|
81
175
|
|
82
176
|
app.use(express.static('public'));
|
83
177
|
app.use(express.urlencoded({extended: false}));
|
84
|
-
|
85
|
-
// ルートURLへのアクセスがあった際に/indexにリダイレクトする
|
86
|
-
app.get('/', (req, res) => {
|
87
|
-
res.redirect('/index');
|
88
|
-
});
|
89
178
|
|
90
179
|
// Memo Listの取得
|
91
180
|
app.get('/index', (req, res) => {
|
@@ -98,123 +187,6 @@
|
|
98
187
|
connection.end();
|
99
188
|
}
|
100
189
|
);
|
101
|
-
});
|
102
|
-
|
103
|
-
// 新規メモの作成ページを表示
|
104
|
-
app.get('/new', (req, res) => {
|
105
|
-
res.render('new.ejs');
|
106
|
-
});
|
107
|
-
|
108
|
-
// 新規メモを保存
|
109
|
-
app.post('/create', (req, res) => {
|
110
|
-
const connection = mod.connection;
|
111
|
-
connection.query(
|
112
|
-
'INSERT INTO memos (title, content) VALUES (?, ?)',
|
113
|
-
[req.body.memoTitle, req.body.memoContent],
|
114
|
-
(err, data) => {
|
115
|
-
res.redirect('/index');
|
116
|
-
connection.end();
|
117
|
-
}
|
118
|
-
);
|
119
|
-
});
|
120
|
-
|
121
|
-
// メモの編集ページを取得
|
122
|
-
app.get('/edit/:id', (req, res) => {
|
123
|
-
const connection = mod.connection;
|
124
|
-
connection.query(
|
125
|
-
'SELECT * FROM memos WHERE id = ?',
|
126
|
-
[req.params.id],
|
127
|
-
(err, data) => {
|
128
|
-
res.render('edit.ejs', {memo: data.rows[0]});
|
129
|
-
connection.end();
|
130
|
-
}
|
131
|
-
);
|
132
|
-
});
|
133
|
-
|
134
|
-
// メモを更新
|
135
|
-
app.post('/update/:id', (req, res) => {
|
136
|
-
const connection = mod.connection;
|
137
|
-
connection.query(
|
138
|
-
'UPDATE memos SET title = ?, content= ? WHERE id = ?',
|
139
|
-
[req.body.memoTitle, req.body.memoContent, req.params.id],
|
140
|
-
(err, data) => {
|
141
|
-
res.redirect('/index');
|
142
|
-
connection.end();
|
143
|
-
}
|
144
|
-
);
|
145
|
-
});
|
146
|
-
|
147
|
-
// Trash Listの取得
|
148
|
-
app.get('/trash', (req, res) => {
|
149
|
-
const connection = mod.connection;
|
150
|
-
connection.query(
|
151
|
-
'SELECT * FROM memos WHERE is_removed = true',
|
152
|
-
(err, data) => {
|
153
|
-
console.log(data.rows);
|
154
|
-
res.render('trash.ejs', {memos: data.rows});
|
155
|
-
connection.end();
|
156
|
-
}
|
157
|
-
);
|
158
|
-
});
|
159
|
-
|
160
|
-
// メモを/indexから/trashへ
|
161
|
-
app.post('/remove/:id', (req, res) => {
|
162
|
-
const connection = mod.connection;
|
163
|
-
const id = req.params.id;
|
164
|
-
connection.query(
|
165
|
-
'UPDATE memos SET is_removed = true WHERE id = ?',
|
166
|
-
[id],
|
167
|
-
(err, data) => {
|
168
|
-
res.redirect('/index');
|
169
|
-
connection.end();
|
170
|
-
}
|
171
|
-
);
|
172
|
-
});
|
173
|
-
|
174
|
-
// メモを/trashから/indexへ
|
175
|
-
app.post('/restore/:id', (req, res) => {
|
176
|
-
const connection = mod.connection;
|
177
|
-
const id = req.params.id;
|
178
|
-
connection.query(
|
179
|
-
'UPDATE memos SET is_removed = false WHERE id = ?',
|
180
|
-
[id],
|
181
|
-
(err, data) => {
|
182
|
-
res.redirect('/trash');
|
183
|
-
connection.end();
|
184
|
-
}
|
185
|
-
);
|
186
|
-
});
|
187
|
-
|
188
|
-
// /trashからメモを完全削除
|
189
|
-
app.post('/delete/:id', (req, res) => {
|
190
|
-
const connection = mod.connection;
|
191
|
-
const id = req.params.id;
|
192
|
-
connection.query(
|
193
|
-
'DELETE FROM memos WHERE id = ?',
|
194
|
-
[id],
|
195
|
-
(err, data) => {
|
196
|
-
res.redirect('/trash');
|
197
|
-
connection.end();
|
198
|
-
}
|
199
|
-
);
|
200
|
-
});
|
201
|
-
|
202
|
-
// Trash Listを空にする
|
203
|
-
app.post('/empty', (req, res) => {
|
204
|
-
const connection = mod.connection;
|
205
|
-
connection.query(
|
206
|
-
'DELETE FROM memos WHERE is_removed = true',
|
207
|
-
(err, data) => {
|
208
|
-
res.redirect('/trash');
|
209
|
-
connection.end();
|
210
|
-
}
|
211
|
-
);
|
212
|
-
});
|
213
|
-
|
214
|
-
const port = process.env.PORT || 8001;
|
215
|
-
|
216
|
-
app.listen(port, () => {
|
217
|
-
console.info(`Listeninng on ${port}`);
|
218
190
|
});
|
219
191
|
```
|
220
192
|
|
18
書式の改善
test
CHANGED
File without changes
|
test
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
それに伴い、お尋ねしたい問題がございます。
|
6
6
|
|
7
7
|
### PostgreSQLと既存のコードが噛み合わない
|
8
|
-
移行にあたり必要なコードの書き換えなどは一通り終えたつもりなのですが、実行してみたところ、EJSファイルに次のようなエラーが発生しました(EJSというのは、HTML内にJavascriptを簡単に記述できるJSのテンプレートエンジンです)。
|
8
|
+
移行にあたり必要なコードの書き換えなどは一通り終えたつもりなのですが、実行してみたところ、EJSファイルに次のようなエラーが発生してしまい、接続が切れてしまいました(EJSというのは、HTML内にJavascriptを簡単に記述できるJSのテンプレートエンジンです)。
|
9
9
|
|
10
10
|
```app.jsの実行結果(更新しました)
|
11
11
|
Listeninng on 8001 // 1行目: 実行時にconsole.infoで出力されるテキスト
|
17
書式の改善
test
CHANGED
File without changes
|
test
CHANGED
@@ -35,7 +35,7 @@
|
|
35
35
|
どうか皆様のお知恵をお貸しくださいませ。
|
36
36
|
|
37
37
|
### 該当のソースコード・テーブル
|
38
|
-
以下のひとつめが新しく作ったPostgreSQLのmemosテーブルの構造、
|
38
|
+
以下のひとつめが新しく作ったPostgreSQLのmemosテーブルの構造、ふたつめが以前から存在したMySQLのmemosテーブルの構造です。
|
39
39
|
|
40
40
|
```PostgreSQL
|
41
41
|
memo_app=# \d memos;
|
16
書式の改善
test
CHANGED
File without changes
|
test
CHANGED
@@ -311,7 +311,7 @@
|
|
311
311
|
どうぞよろしくお願いいたします。
|
312
312
|
|
313
313
|
### 追記
|
314
|
-
こちらの投稿にて同時に
|
314
|
+
こちらの投稿にて同時に質問していた「PostgreSQLの生成列でTo_charを使いたい」という問題は、本題がふたつ存在したことで分かり辛くなってしまったため、別の投稿に移動いたしました。
|
315
315
|
https://teratail.com/questions/5xbktfa8l5dr0f
|
316
316
|
|
317
317
|
お付き合いいただいている皆様にはご不便をおかけしてしまい、誠に申し訳ございません。
|
15
書式の改善
test
CHANGED
File without changes
|
test
CHANGED
@@ -312,5 +312,7 @@
|
|
312
312
|
|
313
313
|
### 追記
|
314
314
|
こちらの投稿にて同時に記載していた「PostgreSQLの生成列でTo_charを使いたい」という質問は、本題がふたつ存在したために分かり辛くなってしまったため、別の投稿に移動いたしました。
|
315
|
+
https://teratail.com/questions/5xbktfa8l5dr0f
|
316
|
+
|
315
317
|
お付き合いいただいている皆様にはご不便をおかけしてしまい、誠に申し訳ございません。
|
316
318
|
|
14
書式の改善
test
CHANGED
File without changes
|
test
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
Node.jsで書かれたメモアプリで、以前はMySQLを接続していたのですが、この度PostgreSQLに移行することになりました。
|
5
5
|
それに伴い、お尋ねしたい問題がございます。
|
6
6
|
|
7
|
-
###
|
7
|
+
### PostgreSQLと既存のコードが噛み合わない
|
8
8
|
移行にあたり必要なコードの書き換えなどは一通り終えたつもりなのですが、実行してみたところ、EJSファイルに次のようなエラーが発生しました(EJSというのは、HTML内にJavascriptを簡単に記述できるJSのテンプレートエンジンです)。
|
9
9
|
|
10
10
|
```app.jsの実行結果(更新しました)
|
13
書式の改善
test
CHANGED
File without changes
|
test
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
お世話になります。
|
3
3
|
|
4
4
|
Node.jsで書かれたメモアプリで、以前はMySQLを接続していたのですが、この度PostgreSQLに移行することになりました。
|
5
|
-
それに伴い、お尋ねしたい問題が
|
5
|
+
それに伴い、お尋ねしたい問題がございます。
|
6
6
|
|
7
7
|
### ひとつめ・PostgreSQLと既存のコードが噛み合わない
|
8
8
|
移行にあたり必要なコードの書き換えなどは一通り終えたつもりなのですが、実行してみたところ、EJSファイルに次のようなエラーが発生しました(EJSというのは、HTML内にJavascriptを簡単に記述できるJSのテンプレートエンジンです)。
|
@@ -34,25 +34,6 @@
|
|
34
34
|
まだPosrgreSQLに不慣れなため、おそらく書き換えの際に書式の間違いや誤字が発生したのだと思いますが、自力ではこれ以上見つけることができず……。
|
35
35
|
どうか皆様のお知恵をお貸しくださいませ。
|
36
36
|
|
37
|
-
### ふたつめ・PostgreSQLの生成列でTo_charを使いたい
|
38
|
-
従来のMySQLでは、以下のように定義したカラムが存在します。
|
39
|
-
```MySQL
|
40
|
-
ALTER TABLE テーブル名 ADD カラム名 VARCHAR(15) DEFAULT GENERATED ALWAYS AS (DATE_FORMAT(参照カラム名, '%b %d %y %k:%i')) STORED;
|
41
|
-
```
|
42
|
-
PostgreSQLでもこれと同様に機能するカラムを作りたいのですが、自分なりに調べて以下のように定義してみてもうまくいきませんでした。
|
43
|
-
|
44
|
-
```PostgreSQLで試したコマンドとそのエラー
|
45
|
-
// 実行コマンド
|
46
|
-
ALTER TABLE テーブル名 ADD カラム名 VARCHAR(15) DEFAULT GENERATED ALWAYS AS IDENTITY (To_char(参照カラム名, 'Mon DD YY HH24:MI'));
|
47
|
-
|
48
|
-
// エラー文
|
49
|
-
ERROR: "ALWAYS"またはその近辺で構文エラー
|
50
|
-
行 1: ...ブル名 ADD カラム名 VARCHAR(15) DEFAULT GENERATED ALWAYS AS ...
|
51
|
-
```
|
52
|
-
|
53
|
-
To-charの生成列での使い方を検索してみたのですが、SELECT文での使用例しか見つけることができずに行き詰まっております。
|
54
|
-
こちらについても、よい解決法をご教示いただけますと幸いです。
|
55
|
-
|
56
37
|
### 該当のソースコード・テーブル
|
57
38
|
以下のひとつめが新しく作ったPostgreSQLのmemosテーブルの構造、2枚目が以前から存在したMySQLのmemosテーブルの構造です。
|
58
39
|
|
@@ -74,21 +55,21 @@
|
|
74
55
|
update_tri BEFORE UPDATE ON memos FOR EACH ROW EXECUTE FUNCTION set_update_time()
|
75
56
|
```
|
76
57
|
|
77
|
-
```MySQL
|
58
|
+
```MySQL(isRemovedをis_removedに、isLockedをis_lockedに改名しました)
|
78
59
|
mysql> desc memos;
|
79
|
-
+---------------+----------------+------+-----+-------------------+-----------------------------------------------+
|
60
|
+
+----------------+----------------+------+-----+-------------------+-----------------------------------------------+
|
80
|
-
| Field | Type | Null | Key | Default | Extra |
|
61
|
+
| Field | Type | Null | Key | Default | Extra |
|
81
|
-
+---------------+----------------+------+-----+-------------------+-----------------------------------------------+
|
62
|
+
+----------------+----------------+------+-----+-------------------+-----------------------------------------------+
|
82
|
-
| id | int | NO | PRI | NULL | auto_increment |
|
63
|
+
| id | int | NO | PRI | NULL | auto_increment |
|
83
|
-
| title | varchar(40) | YES | | Untitled | |
|
64
|
+
| title | varchar(40) | YES | | Untitled | |
|
84
|
-
| content | varchar(16383) | YES | | NULL | |
|
65
|
+
| content | varchar(16383) | YES | | NULL | |
|
85
|
-
| created | timestamp | YES | | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
|
66
|
+
| created | timestamp | YES | | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
|
86
|
-
|
|
67
|
+
| modified | datetime | YES | | CURRENT_TIMESTAMP | DEFAULT_GENERATED on update CURRENT_TIMESTAMP |
|
87
|
-
| modified
|
68
|
+
| modified_stamp | varchar(15) | YES | | NULL | STORED GENERATED |
|
69
|
+
| is_removed | tinyint(1) | NO | | 0 | |
|
88
|
-
| is
|
70
|
+
| is_locked | tinyint(1) | NO | | 0 | |
|
89
|
-
| isRemoved | tinyint(1) | NO | | 0 | |
|
90
|
-
+---------------+----------------+------+-----+-------------------+-----------------------------------------------+
|
71
|
+
+----------------+----------------+------+-----+-------------------+-----------------------------------------------+
|
91
|
-
8 rows in set (0.0
|
72
|
+
8 rows in set (0.05 sec)
|
92
73
|
```
|
93
74
|
|
94
75
|
また、該当のJSファイルとEJSファイルはこちらです。
|
@@ -329,3 +310,7 @@
|
|
329
310
|
|
330
311
|
どうぞよろしくお願いいたします。
|
331
312
|
|
313
|
+
### 追記
|
314
|
+
こちらの投稿にて同時に記載していた「PostgreSQLの生成列でTo_charを使いたい」という質問は、本題がふたつ存在したために分かり辛くなってしまったため、別の投稿に移動いたしました。
|
315
|
+
お付き合いいただいている皆様にはご不便をおかけしてしまい、誠に申し訳ございません。
|
316
|
+
|
12
情報の更新
test
CHANGED
File without changes
|
test
CHANGED
@@ -8,8 +8,8 @@
|
|
8
8
|
移行にあたり必要なコードの書き換えなどは一通り終えたつもりなのですが、実行してみたところ、EJSファイルに次のようなエラーが発生しました(EJSというのは、HTML内にJavascriptを簡単に記述できるJSのテンプレートエンジンです)。
|
9
9
|
|
10
10
|
```app.jsの実行結果(更新しました)
|
11
|
-
Listeninng on 8001
|
12
|
-
|
11
|
+
Listeninng on 8001 // 1行目: 実行時にconsole.infoで出力されるテキスト
|
12
|
+
[ // 2~12行目: 実行後、初めて/indexもしくは/trashにアクセスした際にconsole.logで出力されるdata.rowsの内容(中身は/indexのもの)
|
13
13
|
{
|
14
14
|
id: 1,
|
15
15
|
title: 'mikan',
|
@@ -28,11 +28,8 @@
|
|
28
28
|
at Query.callback (C:\Users\Kanon\workspace\memo-app\app-new.js:79:21)
|
29
29
|
at Query.handleError (C:\Users\Kanon\workspace\memo-app\node_modules\pg\lib\query.js:128:19)
|
30
30
|
at C:\Users\Kanon\workspace\memo-app\node_modules\pg\lib\client.js:580:15
|
31
|
-
at processTicksAndRejections (node:internal/process/task_queues:78:11)
|
31
|
+
at processTicksAndRejections (node:internal/process/task_queues:78:11) // 13行目~: 最初にアクセスしたページから別のページに飛ぼうとすると起こるエラー
|
32
|
-
```
|
32
|
+
```
|
33
|
-
|
34
|
-
実行結果はconsole.logで出力したmemosテーブルの情報とエラーメッセージで構成されています。
|
35
|
-
また、どうやらnode app.jsコマンドでアプリを起動した際ではなく、Localhost8001にアクセスした時にエラーが起こっているようです。
|
36
33
|
|
37
34
|
まだPosrgreSQLに不慣れなため、おそらく書き換えの際に書式の間違いや誤字が発生したのだと思いますが、自力ではこれ以上見つけることができず……。
|
38
35
|
どうか皆様のお知恵をお貸しくださいませ。
|
@@ -96,7 +93,7 @@
|
|
96
93
|
|
97
94
|
また、該当のJSファイルとEJSファイルはこちらです。
|
98
95
|
|
99
|
-
```app.js
|
96
|
+
```app.js(更新しました)
|
100
97
|
const express = require('express');
|
101
98
|
const mod = require('./module')
|
102
99
|
const app = express();
|
@@ -104,17 +101,139 @@
|
|
104
101
|
app.use(express.static('public'));
|
105
102
|
app.use(express.urlencoded({extended: false}));
|
106
103
|
|
104
|
+
// ルートURLへのアクセスがあった際に/indexにリダイレクトする
|
105
|
+
app.get('/', (req, res) => {
|
106
|
+
res.redirect('/index');
|
107
|
+
});
|
108
|
+
|
107
109
|
// Memo Listの取得
|
108
110
|
app.get('/index', (req, res) => {
|
109
111
|
const connection = mod.connection;
|
110
112
|
connection.query(
|
111
113
|
'SELECT * FROM memos WHERE is_removed = false',
|
112
114
|
(err, data) => {
|
113
|
-
console.log(data);
|
115
|
+
console.log(data.rows);
|
114
|
-
res.render('index.ejs', {memos: data});
|
116
|
+
res.render('index.ejs', {memos: data.rows});
|
115
|
-
connection.end();
|
117
|
+
connection.end();
|
116
|
-
}
|
118
|
+
}
|
117
|
-
);
|
119
|
+
);
|
120
|
+
});
|
121
|
+
|
122
|
+
// 新規メモの作成ページを表示
|
123
|
+
app.get('/new', (req, res) => {
|
124
|
+
res.render('new.ejs');
|
125
|
+
});
|
126
|
+
|
127
|
+
// 新規メモを保存
|
128
|
+
app.post('/create', (req, res) => {
|
129
|
+
const connection = mod.connection;
|
130
|
+
connection.query(
|
131
|
+
'INSERT INTO memos (title, content) VALUES (?, ?)',
|
132
|
+
[req.body.memoTitle, req.body.memoContent],
|
133
|
+
(err, data) => {
|
134
|
+
res.redirect('/index');
|
135
|
+
connection.end();
|
136
|
+
}
|
137
|
+
);
|
138
|
+
});
|
139
|
+
|
140
|
+
// メモの編集ページを取得
|
141
|
+
app.get('/edit/:id', (req, res) => {
|
142
|
+
const connection = mod.connection;
|
143
|
+
connection.query(
|
144
|
+
'SELECT * FROM memos WHERE id = ?',
|
145
|
+
[req.params.id],
|
146
|
+
(err, data) => {
|
147
|
+
res.render('edit.ejs', {memo: data.rows[0]});
|
148
|
+
connection.end();
|
149
|
+
}
|
150
|
+
);
|
151
|
+
});
|
152
|
+
|
153
|
+
// メモを更新
|
154
|
+
app.post('/update/:id', (req, res) => {
|
155
|
+
const connection = mod.connection;
|
156
|
+
connection.query(
|
157
|
+
'UPDATE memos SET title = ?, content= ? WHERE id = ?',
|
158
|
+
[req.body.memoTitle, req.body.memoContent, req.params.id],
|
159
|
+
(err, data) => {
|
160
|
+
res.redirect('/index');
|
161
|
+
connection.end();
|
162
|
+
}
|
163
|
+
);
|
164
|
+
});
|
165
|
+
|
166
|
+
// Trash Listの取得
|
167
|
+
app.get('/trash', (req, res) => {
|
168
|
+
const connection = mod.connection;
|
169
|
+
connection.query(
|
170
|
+
'SELECT * FROM memos WHERE is_removed = true',
|
171
|
+
(err, data) => {
|
172
|
+
console.log(data.rows);
|
173
|
+
res.render('trash.ejs', {memos: data.rows});
|
174
|
+
connection.end();
|
175
|
+
}
|
176
|
+
);
|
177
|
+
});
|
178
|
+
|
179
|
+
// メモを/indexから/trashへ
|
180
|
+
app.post('/remove/:id', (req, res) => {
|
181
|
+
const connection = mod.connection;
|
182
|
+
const id = req.params.id;
|
183
|
+
connection.query(
|
184
|
+
'UPDATE memos SET is_removed = true WHERE id = ?',
|
185
|
+
[id],
|
186
|
+
(err, data) => {
|
187
|
+
res.redirect('/index');
|
188
|
+
connection.end();
|
189
|
+
}
|
190
|
+
);
|
191
|
+
});
|
192
|
+
|
193
|
+
// メモを/trashから/indexへ
|
194
|
+
app.post('/restore/:id', (req, res) => {
|
195
|
+
const connection = mod.connection;
|
196
|
+
const id = req.params.id;
|
197
|
+
connection.query(
|
198
|
+
'UPDATE memos SET is_removed = false WHERE id = ?',
|
199
|
+
[id],
|
200
|
+
(err, data) => {
|
201
|
+
res.redirect('/trash');
|
202
|
+
connection.end();
|
203
|
+
}
|
204
|
+
);
|
205
|
+
});
|
206
|
+
|
207
|
+
// /trashからメモを完全削除
|
208
|
+
app.post('/delete/:id', (req, res) => {
|
209
|
+
const connection = mod.connection;
|
210
|
+
const id = req.params.id;
|
211
|
+
connection.query(
|
212
|
+
'DELETE FROM memos WHERE id = ?',
|
213
|
+
[id],
|
214
|
+
(err, data) => {
|
215
|
+
res.redirect('/trash');
|
216
|
+
connection.end();
|
217
|
+
}
|
218
|
+
);
|
219
|
+
});
|
220
|
+
|
221
|
+
// Trash Listを空にする
|
222
|
+
app.post('/empty', (req, res) => {
|
223
|
+
const connection = mod.connection;
|
224
|
+
connection.query(
|
225
|
+
'DELETE FROM memos WHERE is_removed = true',
|
226
|
+
(err, data) => {
|
227
|
+
res.redirect('/trash');
|
228
|
+
connection.end();
|
229
|
+
}
|
230
|
+
);
|
231
|
+
});
|
232
|
+
|
233
|
+
const port = process.env.PORT || 8001;
|
234
|
+
|
235
|
+
app.listen(port, () => {
|
236
|
+
console.info(`Listeninng on ${port}`);
|
118
237
|
});
|
119
238
|
```
|
120
239
|
|
11
情報の更新
test
CHANGED
File without changes
|
test
CHANGED
@@ -7,129 +7,28 @@
|
|
7
7
|
### ひとつめ・PostgreSQLと既存のコードが噛み合わない
|
8
8
|
移行にあたり必要なコードの書き換えなどは一通り終えたつもりなのですが、実行してみたところ、EJSファイルに次のようなエラーが発生しました(EJSというのは、HTML内にJavascriptを簡単に記述できるJSのテンプレートエンジンです)。
|
9
9
|
|
10
|
-
```app.jsの実行結果
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
name:
|
29
|
-
|
30
|
-
|
31
|
-
d
|
32
|
-
dataTypeSize: 4,
|
33
|
-
dataTypeModifier: -1,
|
34
|
-
format: 'text'
|
35
|
-
},
|
36
|
-
Field {
|
37
|
-
name: 'title',
|
38
|
-
tableID: 16399,
|
39
|
-
columnID: 2,
|
40
|
-
dataTypeID: 1043,
|
41
|
-
dataTypeSize: -1,
|
42
|
-
dataTypeModifier: 44,
|
43
|
-
format: 'text'
|
44
|
-
},
|
45
|
-
Field {
|
46
|
-
name: 'content',
|
47
|
-
tableID: 16399,
|
48
|
-
columnID: 3,
|
49
|
-
dataTypeID: 1043,
|
50
|
-
dataTypeSize: -1,
|
51
|
-
dataTypeModifier: 10485764,
|
52
|
-
format: 'text'
|
53
|
-
},
|
54
|
-
Field {
|
55
|
-
name: 'created',
|
56
|
-
tableID: 16399,
|
57
|
-
columnID: 4,
|
58
|
-
dataTypeID: 1114,
|
59
|
-
dataTypeSize: 8,
|
60
|
-
dataTypeModifier: -1,
|
61
|
-
format: 'text'
|
62
|
-
},
|
63
|
-
Field {
|
64
|
-
name: 'modified',
|
65
|
-
tableID: 16399,
|
66
|
-
columnID: 5,
|
67
|
-
dataTypeID: 1114,
|
68
|
-
dataTypeSize: 8,
|
69
|
-
dataTypeModifier: -1,
|
70
|
-
format: 'text'
|
71
|
-
},
|
72
|
-
Field {
|
73
|
-
name: 'is_removed',
|
74
|
-
tableID: 16399,
|
75
|
-
columnID: 6,
|
76
|
-
dataTypeID: 16,
|
77
|
-
dataTypeSize: 1,
|
78
|
-
dataTypeModifier: -1,
|
79
|
-
format: 'text'
|
80
|
-
},
|
81
|
-
Field {
|
82
|
-
name: 'is_locked',
|
83
|
-
tableID: 16399,
|
84
|
-
columnID: 7,
|
85
|
-
dataTypeID: 16,
|
86
|
-
dataTypeSize: 1,
|
87
|
-
dataTypeModifier: -1,
|
88
|
-
format: 'text'
|
89
|
-
}
|
90
|
-
],
|
91
|
-
_parsers: [
|
92
|
-
[Function: parseInteger],
|
93
|
-
[Function: noParse],
|
94
|
-
[Function: noParse],
|
95
|
-
[Function: parseDate],
|
96
|
-
[Function: parseDate],
|
97
|
-
[Function: parseBool],
|
98
|
-
[Function: parseBool]
|
99
|
-
],
|
100
|
-
_types: TypeOverrides {
|
101
|
-
_types: {
|
102
|
-
getTypeParser: [Function: getTypeParser],
|
103
|
-
setTypeParser: [Function: setTypeParser],
|
104
|
-
arrayParser: [Object],
|
105
|
-
builtins: [Object]
|
106
|
-
RowCtor: null,
|
107
|
-
rowAsArray: false,
|
108
|
-
_prebuiltEmptyResultObject: {
|
109
|
-
id: null,
|
110
|
-
title: null,
|
111
|
-
content: null,
|
112
|
-
created: null,
|
113
|
-
modified: null,
|
114
|
-
is_removed: null,
|
115
|
-
is_locked: null
|
116
|
-
} // ここまでがmemosに渡された内容だと思われます。
|
117
|
-
>> 31| <% memos.forEach((memo) => { %>
|
118
|
-
32| <li>
|
119
|
-
33| <span class="title-column"><%= memo.title %></span>
|
120
|
-
34| <div class="items">
|
121
|
-
|
122
|
-
memos.forEach is not a function
|
123
|
-
at eval ("C:\\Users\\Kanon\\workspace\\memo-app\\views\\index.ejs":15:14)
|
124
|
-
at index (C:\Users\Kanon\workspace\memo-app\node_modules\ejs\lib\ejs.js:703:17)
|
125
|
-
at tryHandleCache (C:\Users\Kanon\workspace\memo-app\node_modules\ejs\lib\ejs.js:274:36)
|
126
|
-
at View.exports.renderFile [as engine] (C:\Users\Kanon\workspace\memo-app\node_modules\ejs\lib\ejs.js:491:10)
|
127
|
-
at View.render (C:\Users\Kanon\workspace\memo-app\node_modules\express\lib\view.js:135:8)
|
128
|
-
at tryRender (C:\Users\Kanon\workspace\memo-app\node_modules\express\lib\application.js:657:10)
|
129
|
-
at Function.render (C:\Users\Kanon\workspace\memo-app\node_modules\express\lib\application.js:609:3)
|
130
|
-
at ServerResponse.render (C:\Users\Kanon\workspace\memo-app\node_modules\express\lib\response.js:1039:7)
|
131
|
-
at Query.<anonymous> (C:\Users\Kanon\workspace\memo-app\app-new.js:20:8)
|
132
|
-
at Query.handleReadyForQuery (C:\Users\Kanon\workspace\memo-app\node_modules\pg\lib\query.js:139:14)
|
10
|
+
```app.jsの実行結果(更新しました)
|
11
|
+
Listeninng on 8001
|
12
|
+
[ // 2~12行目: 実行後、初めて/index もしくは
|
13
|
+
{
|
14
|
+
id: 1,
|
15
|
+
title: 'mikan',
|
16
|
+
content: 'choco',
|
17
|
+
created: 2023-12-01T07:16:14.517Z,
|
18
|
+
modified: 2023-12-01T07:18:47.483Z,
|
19
|
+
is_removed: false,
|
20
|
+
is_locked: false
|
21
|
+
}
|
22
|
+
]
|
23
|
+
C:\Users\Kanon\workspace\memo-app\app.js:79
|
24
|
+
console.log(data.rows);
|
25
|
+
^
|
26
|
+
|
27
|
+
TypeError: Cannot read properties of undefined (reading 'rows')
|
28
|
+
at Query.callback (C:\Users\Kanon\workspace\memo-app\app-new.js:79:21)
|
29
|
+
at Query.handleError (C:\Users\Kanon\workspace\memo-app\node_modules\pg\lib\query.js:128:19)
|
30
|
+
at C:\Users\Kanon\workspace\memo-app\node_modules\pg\lib\client.js:580:15
|
31
|
+
at processTicksAndRejections (node:internal/process/task_queues:78:11)
|
133
32
|
```
|
134
33
|
|
135
34
|
実行結果はconsole.logで出力したmemosテーブルの情報とエラーメッセージで構成されています。
|
10
書式の改善
test
CHANGED
File without changes
|
test
CHANGED
@@ -130,10 +130,6 @@
|
|
130
130
|
at ServerResponse.render (C:\Users\Kanon\workspace\memo-app\node_modules\express\lib\response.js:1039:7)
|
131
131
|
at Query.<anonymous> (C:\Users\Kanon\workspace\memo-app\app-new.js:20:8)
|
132
132
|
at Query.handleReadyForQuery (C:\Users\Kanon\workspace\memo-app\node_modules\pg\lib\query.js:139:14)
|
133
|
-
```
|
134
|
-
|
135
|
-
```memos
|
136
|
-
|
137
133
|
```
|
138
134
|
|
139
135
|
実行結果はconsole.logで出力したmemosテーブルの情報とエラーメッセージで構成されています。
|
9
書式の改善
test
CHANGED
File without changes
|
test
CHANGED
@@ -106,6 +106,14 @@
|
|
106
106
|
RowCtor: null,
|
107
107
|
rowAsArray: false,
|
108
108
|
_prebuiltEmptyResultObject: {
|
109
|
+
id: null,
|
110
|
+
title: null,
|
111
|
+
content: null,
|
112
|
+
created: null,
|
113
|
+
modified: null,
|
114
|
+
is_removed: null,
|
115
|
+
is_locked: null
|
116
|
+
} // ここまでがmemosに渡された内容だと思われます。
|
109
117
|
>> 31| <% memos.forEach((memo) => { %>
|
110
118
|
32| <li>
|
111
119
|
33| <span class="title-column"><%= memo.title %></span>
|
@@ -124,7 +132,10 @@
|
|
124
132
|
at Query.handleReadyForQuery (C:\Users\Kanon\workspace\memo-app\node_modules\pg\lib\query.js:139:14)
|
125
133
|
```
|
126
134
|
|
127
|
-
|
135
|
+
```memos
|
136
|
+
|
137
|
+
```
|
138
|
+
|
128
139
|
実行結果はconsole.logで出力したmemosテーブルの情報とエラーメッセージで構成されています。
|
129
140
|
また、どうやらnode app.jsコマンドでアプリを起動した際ではなく、Localhost8001にアクセスした時にエラーが起こっているようです。
|
130
141
|
|
8
書式の改善
test
CHANGED
File without changes
|
test
CHANGED
@@ -7,10 +7,126 @@
|
|
7
7
|
### ひとつめ・PostgreSQLと既存のコードが噛み合わない
|
8
8
|
移行にあたり必要なコードの書き換えなどは一通り終えたつもりなのですが、実行してみたところ、EJSファイルに次のようなエラーが発生しました(EJSというのは、HTML内にJavascriptを簡単に記述できるJSのテンプレートエンジンです)。
|
9
9
|
|
10
|
+
```app.jsの実行結果
|
11
|
+
Result {
|
12
|
+
command: 'SELECT',
|
13
|
+
rowCount: 1,
|
14
|
+
oid: null,
|
15
|
+
rows: [
|
16
|
+
{
|
17
|
+
id: 1,
|
18
|
+
title: 'mikan',
|
19
|
+
content: 'choco',
|
20
|
+
created: 2023-12-01T07:16:14.517Z,
|
21
|
+
modified: 2023-12-01T07:18:47.483Z,
|
22
|
+
is_removed: false,
|
23
|
+
is_locked: false
|
24
|
+
}
|
25
|
+
],
|
26
|
+
fields: [
|
27
|
+
Field {
|
28
|
+
name: 'id',
|
29
|
+
tableID: 16399,
|
30
|
+
columnID: 1,
|
31
|
+
dataTypeID: 23,
|
32
|
+
dataTypeSize: 4,
|
33
|
+
dataTypeModifier: -1,
|
34
|
+
format: 'text'
|
35
|
+
},
|
36
|
+
Field {
|
37
|
+
name: 'title',
|
38
|
+
tableID: 16399,
|
39
|
+
columnID: 2,
|
40
|
+
dataTypeID: 1043,
|
41
|
+
dataTypeSize: -1,
|
42
|
+
dataTypeModifier: 44,
|
43
|
+
format: 'text'
|
44
|
+
},
|
45
|
+
Field {
|
46
|
+
name: 'content',
|
47
|
+
tableID: 16399,
|
48
|
+
columnID: 3,
|
49
|
+
dataTypeID: 1043,
|
50
|
+
dataTypeSize: -1,
|
51
|
+
dataTypeModifier: 10485764,
|
52
|
+
format: 'text'
|
53
|
+
},
|
54
|
+
Field {
|
55
|
+
name: 'created',
|
56
|
+
tableID: 16399,
|
57
|
+
columnID: 4,
|
58
|
+
dataTypeID: 1114,
|
59
|
+
dataTypeSize: 8,
|
60
|
+
dataTypeModifier: -1,
|
61
|
+
format: 'text'
|
62
|
+
},
|
63
|
+
Field {
|
64
|
+
name: 'modified',
|
65
|
+
tableID: 16399,
|
66
|
+
columnID: 5,
|
67
|
+
dataTypeID: 1114,
|
68
|
+
dataTypeSize: 8,
|
69
|
+
dataTypeModifier: -1,
|
70
|
+
format: 'text'
|
71
|
+
},
|
72
|
+
Field {
|
73
|
+
name: 'is_removed',
|
74
|
+
tableID: 16399,
|
75
|
+
columnID: 6,
|
76
|
+
dataTypeID: 16,
|
77
|
+
dataTypeSize: 1,
|
78
|
+
dataTypeModifier: -1,
|
79
|
+
format: 'text'
|
80
|
+
},
|
81
|
+
Field {
|
82
|
+
name: 'is_locked',
|
83
|
+
tableID: 16399,
|
84
|
+
columnID: 7,
|
85
|
+
dataTypeID: 16,
|
86
|
+
dataTypeSize: 1,
|
87
|
+
dataTypeModifier: -1,
|
88
|
+
format: 'text'
|
89
|
+
}
|
90
|
+
],
|
91
|
+
_parsers: [
|
92
|
+
[Function: parseInteger],
|
93
|
+
[Function: noParse],
|
94
|
+
[Function: noParse],
|
95
|
+
[Function: parseDate],
|
96
|
+
[Function: parseDate],
|
97
|
+
[Function: parseBool],
|
98
|
+
[Function: parseBool]
|
99
|
+
],
|
100
|
+
_types: TypeOverrides {
|
101
|
+
_types: {
|
102
|
+
getTypeParser: [Function: getTypeParser],
|
103
|
+
setTypeParser: [Function: setTypeParser],
|
104
|
+
arrayParser: [Object],
|
105
|
+
builtins: [Object]
|
106
|
+
RowCtor: null,
|
107
|
+
rowAsArray: false,
|
108
|
+
_prebuiltEmptyResultObject: {
|
109
|
+
>> 31| <% memos.forEach((memo) => { %>
|
110
|
+
32| <li>
|
111
|
+
33| <span class="title-column"><%= memo.title %></span>
|
112
|
+
34| <div class="items">
|
113
|
+
|
114
|
+
memos.forEach is not a function
|
115
|
+
at eval ("C:\\Users\\Kanon\\workspace\\memo-app\\views\\index.ejs":15:14)
|
116
|
+
at index (C:\Users\Kanon\workspace\memo-app\node_modules\ejs\lib\ejs.js:703:17)
|
117
|
+
at tryHandleCache (C:\Users\Kanon\workspace\memo-app\node_modules\ejs\lib\ejs.js:274:36)
|
10
|
-
|
118
|
+
at View.exports.renderFile [as engine] (C:\Users\Kanon\workspace\memo-app\node_modules\ejs\lib\ejs.js:491:10)
|
11
|
-
|
119
|
+
at View.render (C:\Users\Kanon\workspace\memo-app\node_modules\express\lib\view.js:135:8)
|
120
|
+
at tryRender (C:\Users\Kanon\workspace\memo-app\node_modules\express\lib\application.js:657:10)
|
121
|
+
at Function.render (C:\Users\Kanon\workspace\memo-app\node_modules\express\lib\application.js:609:3)
|
122
|
+
at ServerResponse.render (C:\Users\Kanon\workspace\memo-app\node_modules\express\lib\response.js:1039:7)
|
123
|
+
at Query.<anonymous> (C:\Users\Kanon\workspace\memo-app\app-new.js:20:8)
|
124
|
+
at Query.handleReadyForQuery (C:\Users\Kanon\workspace\memo-app\node_modules\pg\lib\query.js:139:14)
|
125
|
+
```
|
126
|
+
|
12
|
-
|
127
|
+
こちらがapp.js実行時に出力された結果です。
|
128
|
+
実行結果はconsole.logで出力したmemosテーブルの情報とエラーメッセージで構成されています。
|
13
|
-
|
129
|
+
また、どうやらnode app.jsコマンドでアプリを起動した際ではなく、Localhost8001にアクセスした時にエラーが起こっているようです。
|
14
130
|
|
15
131
|
まだPosrgreSQLに不慣れなため、おそらく書き換えの際に書式の間違いや誤字が発生したのだと思いますが、自力ではこれ以上見つけることができず……。
|
16
132
|
どうか皆様のお知恵をお貸しくださいませ。
|
@@ -74,18 +190,13 @@
|
|
74
190
|
|
75
191
|
また、該当のJSファイルとEJSファイルはこちらです。
|
76
192
|
|
77
|
-
```app.js
|
193
|
+
```app.jsの/index周辺情報
|
78
194
|
const express = require('express');
|
79
195
|
const mod = require('./module')
|
80
196
|
const app = express();
|
81
197
|
|
82
198
|
app.use(express.static('public'));
|
83
199
|
app.use(express.urlencoded({extended: false}));
|
84
|
-
|
85
|
-
// ルートURLへのアクセスがあった際に/indexにリダイレクトする
|
86
|
-
app.get('/', (req, res) => {
|
87
|
-
res.redirect('/index');
|
88
|
-
});
|
89
200
|
|
90
201
|
// Memo Listの取得
|
91
202
|
app.get('/index', (req, res) => {
|
@@ -98,123 +209,6 @@
|
|
98
209
|
connection.end();
|
99
210
|
}
|
100
211
|
);
|
101
|
-
});
|
102
|
-
|
103
|
-
// 新規メモの作成ページを表示
|
104
|
-
app.get('/new', (req, res) => {
|
105
|
-
res.render('new.ejs');
|
106
|
-
});
|
107
|
-
|
108
|
-
// 新規メモを保存
|
109
|
-
app.post('/create', (req, res) => {
|
110
|
-
const connection = mod.connection;
|
111
|
-
connection.query(
|
112
|
-
'INSERT INTO memos (title, content) VALUES (?, ?)',
|
113
|
-
[req.body.memoTitle, req.body.memoContent],
|
114
|
-
(err, data) => {
|
115
|
-
res.redirect('/index');
|
116
|
-
connection.end();
|
117
|
-
}
|
118
|
-
);
|
119
|
-
});
|
120
|
-
|
121
|
-
// メモの編集ページを取得
|
122
|
-
app.get('/edit/:id', (req, res) => {
|
123
|
-
const connection = mod.connection;
|
124
|
-
connection.query(
|
125
|
-
'SELECT * FROM memos WHERE id = ?',
|
126
|
-
[req.params.id],
|
127
|
-
(err, data) => {
|
128
|
-
res.render('edit.ejs', {memo: data[0]});
|
129
|
-
connection.end();
|
130
|
-
}
|
131
|
-
);
|
132
|
-
});
|
133
|
-
|
134
|
-
// メモを更新
|
135
|
-
app.post('/update/:id', (req, res) => {
|
136
|
-
const connection = mod.connection;
|
137
|
-
connection.query(
|
138
|
-
'UPDATE memos SET title = ?, content= ? WHERE id = ?',
|
139
|
-
[req.body.memoTitle, req.body.memoContent, req.params.id],
|
140
|
-
(err, data) => {
|
141
|
-
res.redirect('/index');
|
142
|
-
connection.end();
|
143
|
-
}
|
144
|
-
);
|
145
|
-
});
|
146
|
-
|
147
|
-
// Trash Listの取得
|
148
|
-
app.get('/trash', (req, res) => {
|
149
|
-
const connection = mod.connection;
|
150
|
-
connection.query(
|
151
|
-
'SELECT * FROM memos WHERE is_removed = true',
|
152
|
-
(err, data) => {
|
153
|
-
console.log(data);
|
154
|
-
res.render('trash.ejs', {memos: data});
|
155
|
-
connection.end();
|
156
|
-
}
|
157
|
-
);
|
158
|
-
});
|
159
|
-
|
160
|
-
// メモを/indexから/trashへ
|
161
|
-
app.post('/remove/:id', (req, res) => {
|
162
|
-
const connection = mod.connection;
|
163
|
-
const id = req.params.id;
|
164
|
-
connection.query(
|
165
|
-
'UPDATE memos SET is_removed = true WHERE id = ?',
|
166
|
-
[id],
|
167
|
-
(err, data) => {
|
168
|
-
res.redirect('/index');
|
169
|
-
connection.end();
|
170
|
-
}
|
171
|
-
);
|
172
|
-
});
|
173
|
-
|
174
|
-
// メモを/trashから/indexへ
|
175
|
-
app.post('/restore/:id', (req, res) => {
|
176
|
-
const connection = mod.connection;
|
177
|
-
const id = req.params.id;
|
178
|
-
connection.query(
|
179
|
-
'UPDATE memos SET is_removed = false WHERE id = ?',
|
180
|
-
[id],
|
181
|
-
(err, data) => {
|
182
|
-
res.redirect('/trash');
|
183
|
-
connection.end();
|
184
|
-
}
|
185
|
-
);
|
186
|
-
});
|
187
|
-
|
188
|
-
// /trashからメモを完全削除
|
189
|
-
app.post('/delete/:id', (req, res) => {
|
190
|
-
const connection = mod.connection;
|
191
|
-
const id = req.params.id;
|
192
|
-
connection.query(
|
193
|
-
'DELETE FROM memos WHERE id = ?',
|
194
|
-
[id],
|
195
|
-
(err, data) => {
|
196
|
-
res.redirect('/trash');
|
197
|
-
connection.end();
|
198
|
-
}
|
199
|
-
);
|
200
|
-
});
|
201
|
-
|
202
|
-
// Trash Listを空にする
|
203
|
-
app.post('/empty', (req, res) => {
|
204
|
-
const connection = mod.connection;
|
205
|
-
connection.query(
|
206
|
-
'DELETE FROM memos WHERE is_removed = true',
|
207
|
-
(err, data) => {
|
208
|
-
res.redirect('/trash');
|
209
|
-
connection.end();
|
210
|
-
}
|
211
|
-
);
|
212
|
-
});
|
213
|
-
|
214
|
-
const port = process.env.PORT || 8001;
|
215
|
-
|
216
|
-
app.listen(port, () => {
|
217
|
-
console.info(`Listeninng on ${port}`);
|
218
212
|
});
|
219
213
|
```
|
220
214
|
|
7
書式の改善
test
CHANGED
File without changes
|
test
CHANGED
@@ -17,12 +17,19 @@
|
|
17
17
|
|
18
18
|
### ふたつめ・PostgreSQLの生成列でTo_charを使いたい
|
19
19
|
従来のMySQLでは、以下のように定義したカラムが存在します。
|
20
|
-
|
20
|
+
```MySQL
|
21
|
-
|
21
|
+
ALTER TABLE テーブル名 ADD カラム名 VARCHAR(15) DEFAULT GENERATED ALWAYS AS (DATE_FORMAT(参照カラム名, '%b %d %y %k:%i')) STORED;
|
22
|
-
|
22
|
+
```
|
23
23
|
PostgreSQLでもこれと同様に機能するカラムを作りたいのですが、自分なりに調べて以下のように定義してみてもうまくいきませんでした。
|
24
24
|
|
25
|
+
```PostgreSQLで試したコマンドとそのエラー
|
26
|
+
// 実行コマンド
|
25
|
-
|
27
|
+
ALTER TABLE テーブル名 ADD カラム名 VARCHAR(15) DEFAULT GENERATED ALWAYS AS IDENTITY (To_char(参照カラム名, 'Mon DD YY HH24:MI'));
|
28
|
+
|
29
|
+
// エラー文
|
30
|
+
ERROR: "ALWAYS"またはその近辺で構文エラー
|
31
|
+
行 1: ...ブル名 ADD カラム名 VARCHAR(15) DEFAULT GENERATED ALWAYS AS ...
|
32
|
+
```
|
26
33
|
|
27
34
|
To-charの生成列での使い方を検索してみたのですが、SELECT文での使用例しか見つけることができずに行き詰まっております。
|
28
35
|
こちらについても、よい解決法をご教示いただけますと幸いです。
|
@@ -39,7 +46,7 @@
|
|
39
46
|
title | character varying(40) | | | 'Untitled'::character varying
|
40
47
|
content | character varying(10485760) | | |
|
41
48
|
created | timestamp without time zone | | not null | CURRENT_TIMESTAMP
|
42
|
-
modified | timestamp without time zone | | not null | CURRENT_TIMESTAMP
|
49
|
+
modified | > 引用テキストtimestamp without time zone | | not null | CURRENT_TIMESTAMP
|
43
50
|
is_removed | boolean | | not null | false
|
44
51
|
is_locked | boolean | | not null | false
|
45
52
|
インデックス:
|
6
実行結果についての追記
test
CHANGED
File without changes
|
test
CHANGED
@@ -7,26 +7,10 @@
|
|
7
7
|
### ひとつめ・PostgreSQLと既存のコードが噛み合わない
|
8
8
|
移行にあたり必要なコードの書き換えなどは一通り終えたつもりなのですが、実行してみたところ、EJSファイルに次のようなエラーが発生しました(EJSというのは、HTML内にJavascriptを簡単に記述できるJSのテンプレートエンジンです)。
|
9
9
|
|
10
|
-
```app.s実行時のエラーメッセージ
|
11
|
-
_prebuiltEmptyResultObject: {
|
12
|
-
>> 31| <% memos.forEach((memo) => { %>
|
13
|
-
32| <li>
|
14
|
-
33| <span class="title-column"><%= memo.title %></span>
|
15
|
-
34| <div class="items">
|
16
|
-
|
17
|
-
memos.forEach is not a function
|
18
|
-
at eval ("C:\\Users\\Kanon\\workspace\\memo-app\\views\\index.ejs":15:14)
|
19
|
-
at index (C:\Users\Kanon\workspace\memo-app\node_modules\ejs\lib\ejs.js:703:17)
|
20
|
-
at tryHandleCache (C:\Users\Kanon\workspace\memo-app\node_modules\ejs\lib\ejs.js:274:36)
|
21
|
-
|
10
|
+
【app.jsの実行結果】https://drive.google.com/file/d/1Rj-q4GFSJzGgFgEeUCYEDvqryn9oxaH8/view?usp=sharing
|
22
|
-
|
11
|
+
|
23
|
-
at tryRender (C:\Users\Kanon\workspace\memo-app\node_modules\express\lib\application.js:657:10)
|
24
|
-
at Function.render (C:\Users\Kanon\workspace\memo-app\node_modules\express\lib\application.js:609:3)
|
25
|
-
at ServerResponse.render (C:\Users\Kanon\workspace\memo-app\node_modules\express\lib\response.js:1039:7)
|
26
|
-
|
12
|
+
文字数オーバーになってしまったためファイルのリンクから失礼いたしますが、こちらがapp.js実行時に出力された結果です。
|
27
|
-
at Query.handleReadyForQuery (C:\Users\Kanon\workspace\memo-app\node_modules\pg\lib\query.js:139:14)
|
28
|
-
```
|
29
|
-
どうやらnode app.jsコマンドでアプリを起動した際ではなく、Localhost8001にアクセスした時にエラーが起こっているようです。
|
13
|
+
実行結果はconsole.logで出力したテーブルデータとエラーメッセージで構成されています。また、どうやらnode app.jsコマンドでアプリを起動した際ではなく、Localhost8001にアクセスした時にエラーが起こっているようです。
|
30
14
|
|
31
15
|
まだPosrgreSQLに不慣れなため、おそらく書き換えの際に書式の間違いや誤字が発生したのだと思いますが、自力ではこれ以上見つけることができず……。
|
32
16
|
どうか皆様のお知恵をお貸しくださいませ。
|
5
実行結果についての追記
test
CHANGED
File without changes
|
test
CHANGED
@@ -7,14 +7,12 @@
|
|
7
7
|
### ひとつめ・PostgreSQLと既存のコードが噛み合わない
|
8
8
|
移行にあたり必要なコードの書き換えなどは一通り終えたつもりなのですが、実行してみたところ、EJSファイルに次のようなエラーが発生しました(EJSというのは、HTML内にJavascriptを簡単に記述できるJSのテンプレートエンジンです)。
|
9
9
|
|
10
|
-
```エラーメッセージ
|
10
|
+
```app.s実行時のエラーメッセージ
|
11
|
-
TypeError: C:\Users\Kanon\workspace\memo-app\views\index.ejs:31
|
12
|
-
|
11
|
+
_prebuiltEmptyResultObject: {
|
13
|
-
30| <ul class="table-body">
|
14
|
-
>> 31|
|
12
|
+
>> 31| <% memos.forEach((memo) => { %>
|
15
|
-
32|
|
13
|
+
32| <li>
|
16
|
-
33|
|
14
|
+
33| <span class="title-column"><%= memo.title %></span>
|
17
|
-
34|
|
15
|
+
34| <div class="items">
|
18
16
|
|
19
17
|
memos.forEach is not a function
|
20
18
|
at eval ("C:\\Users\\Kanon\\workspace\\memo-app\\views\\index.ejs":15:14)
|
@@ -25,9 +23,10 @@
|
|
25
23
|
at tryRender (C:\Users\Kanon\workspace\memo-app\node_modules\express\lib\application.js:657:10)
|
26
24
|
at Function.render (C:\Users\Kanon\workspace\memo-app\node_modules\express\lib\application.js:609:3)
|
27
25
|
at ServerResponse.render (C:\Users\Kanon\workspace\memo-app\node_modules\express\lib\response.js:1039:7)
|
28
|
-
at Query.<anonymous> (C:\Users\Kanon\workspace\memo-app\app.js:20:8)
|
26
|
+
at Query.<anonymous> (C:\Users\Kanon\workspace\memo-app\app-new.js:20:8)
|
29
27
|
at Query.handleReadyForQuery (C:\Users\Kanon\workspace\memo-app\node_modules\pg\lib\query.js:139:14)
|
30
28
|
```
|
29
|
+
どうやらnode app.jsコマンドでアプリを起動した際ではなく、Localhost8001にアクセスした時にエラーが起こっているようです。
|
31
30
|
|
32
31
|
まだPosrgreSQLに不慣れなため、おそらく書き換えの際に書式の間違いや誤字が発生したのだと思いますが、自力ではこれ以上見つけることができず……。
|
33
32
|
どうか皆様のお知恵をお貸しくださいませ。
|
4
module.jsの追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -226,16 +226,24 @@
|
|
226
226
|
app.listen(port, () => {
|
227
227
|
console.info(`Listeninng on ${port}`);
|
228
228
|
});
|
229
|
+
```
|
230
|
+
|
229
|
-
|
231
|
+
```module.js
|
232
|
+
const { Client } = require('pg');
|
233
|
+
|
230
|
-
const connection =
|
234
|
+
const connection = new Client({
|
235
|
+
user: 'postgres',
|
236
|
+
host: 'localhost',
|
237
|
+
database: 'hoge',
|
238
|
+
password: 'huga',
|
239
|
+
port: 5432,
|
240
|
+
});
|
241
|
+
|
231
|
-
connection.connect(
|
242
|
+
connection.connect();
|
243
|
+
|
244
|
+
module.exports = {
|
232
|
-
i
|
245
|
+
connection
|
233
|
-
console.log('error connecting: ' + err.stack);
|
234
|
-
return;
|
235
|
-
|
246
|
+
}
|
236
|
-
});
|
237
|
-
*/
|
238
|
-
|
239
247
|
```
|
240
248
|
|
241
249
|
```index.ejs
|
3
誤字の修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -39,7 +39,7 @@
|
|
39
39
|
|
40
40
|
PostgreSQLでもこれと同様に機能するカラムを作りたいのですが、自分なりに調べて以下のように定義してみてもうまくいきませんでした。
|
41
41
|
|
42
|
-
> カラム名 VARCHAR(15) DEFAULT GENERATED ALWAYS AS IDENTITY (To
|
42
|
+
> カラム名 VARCHAR(15) DEFAULT GENERATED ALWAYS AS IDENTITY (To_char(参照カラム名, 'Mon DD YY HH24:MI'));
|
43
43
|
|
44
44
|
To-charの生成列での使い方を検索してみたのですが、SELECT文での使用例しか見つけることができずに行き詰まっております。
|
45
45
|
こちらについても、よい解決法をご教示いただけますと幸いです。
|
2
書式の改善
test
CHANGED
File without changes
|
test
CHANGED
@@ -45,13 +45,45 @@
|
|
45
45
|
こちらについても、よい解決法をご教示いただけますと幸いです。
|
46
46
|
|
47
47
|
### 該当のソースコード・テーブル
|
48
|
-
|
48
|
+
以下のひとつめが新しく作ったPostgreSQLのmemosテーブルの構造、2枚目が以前から存在したMySQLのmemosテーブルの構造です。
|
49
|
+
|
49
|
-
|
50
|
+
```PostgreSQL
|
51
|
+
memo_app=# \d memos;
|
52
|
+
テーブル"public.memos"
|
53
|
+
列 | タイプ | 照合順序 | Null 値を許容 | デフォルト
|
54
|
+
------------+-----------------------------+----------+---------------+-----------------------------------
|
55
|
+
id | integer | | not null | nextval('memos_id_seq'::regclass)
|
50
|
-
|
56
|
+
title | character varying(40) | | | 'Untitled'::character varying
|
51
|
-
|
57
|
+
content | character varying(10485760) | | |
|
58
|
+
created | timestamp without time zone | | not null | CURRENT_TIMESTAMP
|
59
|
+
modified | timestamp without time zone | | not null | CURRENT_TIMESTAMP
|
60
|
+
is_removed | boolean | | not null | false
|
61
|
+
is_locked | boolean | | not null | false
|
62
|
+
インデックス:
|
63
|
+
"memos_pkey" PRIMARY KEY, btree (id)
|
64
|
+
トリガー:
|
65
|
+
update_tri BEFORE UPDATE ON memos FOR EACH ROW EXECUTE FUNCTION set_update_time()
|
66
|
+
```
|
67
|
+
|
68
|
+
```MySQL
|
69
|
+
mysql> desc memos;
|
52
|
-
|
70
|
+
+---------------+----------------+------+-----+-------------------+-----------------------------------------------+
|
71
|
+
| Field | Type | Null | Key | Default | Extra |
|
72
|
+
+---------------+----------------+------+-----+-------------------+-----------------------------------------------+
|
73
|
+
| id | int | NO | PRI | NULL | auto_increment |
|
74
|
+
| title | varchar(40) | YES | | Untitled | |
|
75
|
+
| content | varchar(16383) | YES | | NULL | |
|
76
|
+
| created | timestamp | YES | | CURRENT_TIMESTAMP | DEFAULT_GENERATED |
|
77
|
+
| last_modified | datetime | YES | | CURRENT_TIMESTAMP | DEFAULT_GENERATED on update CURRENT_TIMESTAMP |
|
78
|
+
| modified | varchar(15) | YES | | NULL | STORED GENERATED |
|
79
|
+
| isLocked | tinyint(1) | NO | | 0 | |
|
80
|
+
| isRemoved | tinyint(1) | NO | | 0 | |
|
81
|
+
+---------------+----------------+------+-----+-------------------+-----------------------------------------------+
|
82
|
+
8 rows in set (0.03 sec)
|
83
|
+
```
|
53
84
|
|
54
85
|
また、該当のJSファイルとEJSファイルはこちらです。
|
86
|
+
|
55
87
|
```app.js
|
56
88
|
const express = require('express');
|
57
89
|
const mod = require('./module')
|
1
レイアウトの改善
test
CHANGED
File without changes
|
test
CHANGED
@@ -7,7 +7,27 @@
|
|
7
7
|
### ひとつめ・PostgreSQLと既存のコードが噛み合わない
|
8
8
|
移行にあたり必要なコードの書き換えなどは一通り終えたつもりなのですが、実行してみたところ、EJSファイルに次のようなエラーが発生しました(EJSというのは、HTML内にJavascriptを簡単に記述できるJSのテンプレートエンジンです)。
|
9
9
|
|
10
|
+
```エラーメッセージ
|
11
|
+
TypeError: C:\Users\Kanon\workspace\memo-app\views\index.ejs:31
|
12
|
+
29| </div>
|
13
|
+
30| <ul class="table-body">
|
14
|
+
>> 31| <% memos.forEach((memo) => { %>
|
15
|
+
32| <li>
|
16
|
+
33| <span class="title-column"><%= memo.title %></span>
|
17
|
+
34| <div class="items">
|
18
|
+
|
19
|
+
memos.forEach is not a function
|
20
|
+
at eval ("C:\\Users\\Kanon\\workspace\\memo-app\\views\\index.ejs":15:14)
|
21
|
+
at index (C:\Users\Kanon\workspace\memo-app\node_modules\ejs\lib\ejs.js:703:17)
|
22
|
+
at tryHandleCache (C:\Users\Kanon\workspace\memo-app\node_modules\ejs\lib\ejs.js:274:36)
|
10
|
-
|
23
|
+
at View.exports.renderFile [as engine] (C:\Users\Kanon\workspace\memo-app\node_modules\ejs\lib\ejs.js:491:10)
|
24
|
+
at View.render (C:\Users\Kanon\workspace\memo-app\node_modules\express\lib\view.js:135:8)
|
25
|
+
at tryRender (C:\Users\Kanon\workspace\memo-app\node_modules\express\lib\application.js:657:10)
|
26
|
+
at Function.render (C:\Users\Kanon\workspace\memo-app\node_modules\express\lib\application.js:609:3)
|
27
|
+
at ServerResponse.render (C:\Users\Kanon\workspace\memo-app\node_modules\express\lib\response.js:1039:7)
|
28
|
+
at Query.<anonymous> (C:\Users\Kanon\workspace\memo-app\app.js:20:8)
|
29
|
+
at Query.handleReadyForQuery (C:\Users\Kanon\workspace\memo-app\node_modules\pg\lib\query.js:139:14)
|
30
|
+
```
|
11
31
|
|
12
32
|
まだPosrgreSQLに不慣れなため、おそらく書き換えの際に書式の間違いや誤字が発生したのだと思いますが、自力ではこれ以上見つけることができず……。
|
13
33
|
どうか皆様のお知恵をお貸しくださいませ。
|