回答編集履歴

1

createConnectionの使い方の変化に追従出来るよう修正

2021/11/12 06:16

投稿

miyabi-sun
miyabi-sun

スコア21194

test CHANGED
@@ -164,7 +164,9 @@
164
164
 
165
165
 
166
166
 
167
- // ここは基本的にこのままで構わない
167
+ // ここはこのままで構わない
168
+
169
+ // ただし返り値がPromiseのインスタンスになっており、一度thenを叩いて本物のコネクションを取り出す必要がある
168
170
 
169
171
  const connection = mysql.createConnection({
170
172
 
@@ -186,13 +188,15 @@
186
188
 
187
189
 
188
190
 
191
+ // connection.thenを基点に展開する
192
+
189
- connection.query(
193
+ connection.then(c => c.query(
190
194
 
191
195
  'SELECT date, temperature, humidity FROM data WHERE device = ? ORDER BY date ASC;',
192
196
 
193
197
  [req.body.device]
194
198
 
195
- ).then(results => {
199
+ )).then(results => {
196
200
 
197
201
  console.log(results);
198
202
 
@@ -200,25 +204,163 @@
200
204
 
201
205
 
202
206
 
203
- return connection.query(
207
+ return connection.then(c => c.query(
204
208
 
205
209
  'SELECT * FROM data where date=(select max(date) from data where device = ?);',
206
210
 
207
211
  [req.body.device]
208
212
 
213
+ ));
214
+
215
+ }).then(results => {
216
+
217
+ console.log(results);
218
+
219
+ variables.news = results;
220
+
221
+
222
+
223
+ res.render('index.ejs', valiables);
224
+
225
+ });
226
+
227
+ });
228
+
229
+ ```
230
+
231
+
232
+
233
+ Promiseのインスタンスは`.then`メソッドを使う事で数珠つなぎに出来ます。
234
+
235
+ コールバック関数を引数に渡すやり方に比べればネストが一段階下がった事がわかりますね。
236
+
237
+
238
+
239
+ 「で?このPromise使った書き方の何が嬉しいんだい?」
240
+
241
+
242
+
243
+ そうなんですよね、Promiseはコールバック地獄を解決しただけで
244
+
245
+ アプリ開発者目線では別に何も嬉しくなってないんですよね。
246
+
247
+
248
+
249
+ Promiseはasync/await構文と併用して、初めて凄まじい威力を発揮するようになります。
250
+
251
+
252
+
253
+ ```js
254
+
255
+ const mysql = require("mysql2/promise");
256
+
257
+ const connection = mysql.createConnection({
258
+
259
+ host: 'localhost',
260
+
261
+ user: 'root',
262
+
263
+ password: '-------',
264
+
265
+ database: '********'
266
+
267
+ });
268
+
269
+
270
+
271
+ // await構文はasync関数の直下でないと使えない
272
+
273
+ // 普通のアロー関数の前にasyncというワードを付与するだけ
274
+
275
+ app.post('/select', async (req, res) => {
276
+
277
+ // awaitを使うとPromise.then(val => {})を実行してvalを取り出すコードに変換される
278
+
279
+ const c = await connection;
280
+
281
+ const items = await c.query(
282
+
283
+ 'SELECT date, temperature, humidity FROM data WHERE device = ? ORDER BY date ASC;',
284
+
285
+ [req.body.device]
286
+
287
+ );
288
+
289
+ const news = await c.query(
290
+
291
+ 'SELECT * FROM data where date=(select max(date) from data where device = ?);',
292
+
293
+ [req.body.device]
294
+
295
+ );
296
+
297
+
298
+
299
+ console.log(items);
300
+
301
+ console.log(news);
302
+
303
+
304
+
305
+ res.render('index.ejs', {items, news});
306
+
307
+ });
308
+
309
+ ```
310
+
311
+
312
+
313
+ はいめっちゃ読みやすい。
314
+
315
+
316
+
317
+ でもまぁ、今度は`'SELECT * FROM data where date=(select max(date) from data where device = ?);'`が心配ですね。
318
+
319
+ 本当に動くのかい?
320
+
321
+
322
+
323
+ try-catchで拾ってなんかエラー出したら怒るようにしておきましょうか。
324
+
325
+
326
+
327
+ ```js
328
+
329
+ app.post('/select', async (req, res) => {
330
+
331
+ const val = {};
332
+
333
+ try {
334
+
335
+ const c = await connection;
336
+
337
+ const items = await connection.query(
338
+
339
+ 'SELECT date, temperature, humidity FROM data WHERE device = ? ORDER BY date ASC;',
340
+
341
+ [req.body.device]
342
+
209
343
  );
210
344
 
211
- }).then(results => {
212
-
213
- console.log(results);
214
-
215
- variables.news = results;
345
+ const news = await connection.query(
346
+
216
-
347
+ 'SELECT * FROM data where date=(select max(date) from data where device = ?);',
348
+
217
-
349
+ [req.body.device]
350
+
218
-
351
+ );
352
+
219
- res.render('index.ejs', valiables);
353
+ res.render('index.ejs', {items, news});
354
+
220
-
355
+ } catch (e) {
356
+
357
+ console.log("SQLクエリの発行に失敗");
358
+
359
+ console.error(e);
360
+
361
+ res.send('サーバーでの動作が大失敗しました。急いで直すのでしばしお待ちを。');
362
+
221
- });
363
+ }
222
364
 
223
365
  });
224
366
 
@@ -226,138 +368,4 @@
226
368
 
227
369
 
228
370
 
229
- Promiseのインスタンスは`.then`メソッドを使う事で数珠つなぎに出来ます。
230
-
231
- コールバック関数を引数に渡すやり方に比べればネストが一段階下がった事がわかりますね。
232
-
233
-
234
-
235
- 「で?このPromise使った書き方の何が嬉しいんだい?」
236
-
237
-
238
-
239
- そうなんですよね、Promiseはコールバック地獄を解決しただけで
240
-
241
- アプリ開発者目線では別に何も嬉しくなってないんですよね。
242
-
243
-
244
-
245
- Promiseはasync/await構文と併用して、初めて凄まじい威力を発揮するようになります。
246
-
247
-
248
-
249
- ```js
250
-
251
- const mysql = require("mysql2/promise");
252
-
253
- const connection = mysql.createConnection({
254
-
255
- host: 'localhost',
256
-
257
- user: 'root',
258
-
259
- password: '-------',
260
-
261
- database: '********'
262
-
263
- });
264
-
265
-
266
-
267
- // await構文はasync関数の直下でないと使えない
268
-
269
- // 普通のアロー関数の前にasyncというワードを付与するだけ
270
-
271
- app.post('/select', async (req, res) => {
272
-
273
- // awaitを使うとPromise.then(val => {})を実行してvalを取り出すコードに変換される
274
-
275
- const items = await connection.query(
276
-
277
- 'SELECT date, temperature, humidity FROM data WHERE device = ? ORDER BY date ASC;',
278
-
279
- [req.body.device]
280
-
281
- );
282
-
283
- const news = await connection.query(
284
-
285
- 'SELECT * FROM data where date=(select max(date) from data where device = ?);',
286
-
287
- [req.body.device]
288
-
289
- );
290
-
291
-
292
-
293
- console.log(items);
294
-
295
- console.log(news);
296
-
297
-
298
-
299
- res.render('index.ejs', {items, news});
300
-
301
- });
302
-
303
- ```
304
-
305
-
306
-
307
- はいめっちゃ読みやすい。
308
-
309
-
310
-
311
- でもまぁ、今度は`'SELECT * FROM data where date=(select max(date) from data where device = ?);'`が心配ですね。
312
-
313
- 本当に動くのかい?
314
-
315
-
316
-
317
- try-catchで拾ってなんかエラー出したら怒るようにしておきましょうか。
318
-
319
-
320
-
321
- ```js
322
-
323
- app.post('/select', async (req, res) => {
324
-
325
- const val = {};
326
-
327
- try {
328
-
329
- const items = await connection.query(
330
-
331
- 'SELECT date, temperature, humidity FROM data WHERE device = ? ORDER BY date ASC;',
332
-
333
- [req.body.device]
334
-
335
- );
336
-
337
- const news = await connection.query(
338
-
339
- 'SELECT * FROM data where date=(select max(date) from data where device = ?);',
340
-
341
- [req.body.device]
342
-
343
- );
344
-
345
- res.render('index.ejs', {items, news});
346
-
347
- } catch (e) {
348
-
349
- console.log("SQLクエリの発行に失敗");
350
-
351
- console.error(e);
352
-
353
- res.send('サーバーでの動作が大失敗しました。急いで直すのでしばしお待ちを。');
354
-
355
- }
356
-
357
- });
358
-
359
- ```
360
-
361
-
362
-
363
371
  とりまこんな感じですかね。