通常のmysql
モジュールは非同期通信になり扱いづらいので、
同期通信(await
async
)が可能な util
モジュールを使ったサンプルコードです。
同期通信になることで、ネストが少なくなりかなり見やすくなると思います。
SQLの発行は何度も使うと思うので、runQuery
関数を作成しそこにmysql
モジュールとutil
モジュールをラップして使いやすくしています。
コードの細かな説明はコメントで書いてあるので、ぜひ読んでみてください。
エラー処理も書いてあるので、SQLのコネクションがたくさん繋がったまま、SQLサーバに負担のかからないようになっております。
コードのコメントにも書いてありますが、各種モジュールをコマンドライン
でインストールしてください
$ npm i express
$ npm i cors
$ npm i parser
$ npm i util
$ npm i mysql
$ npm i multer
const express = require('express') // expressモジュールを読み込む
const cors = require('cors') //クロスドメインでアクセスを許可する系のやつ
const body_parser = require('body-parser') //いい感じにGET POSTを解釈するやつ
const util = require('util') // SQL Async/Await
const mysql = require('mysql')
const multer = require('multer') // multerモジュールを読み込む これがないとBODYの中身をうまく読み取らない
//↑ 各種、「npm install」してください
//npm i express
//npm i cors
//npm i parser
//npm i util
//npm i mysql
//npm i multer
const app = express() // expressアプリを生成する
app.use(body_parser())
app.use(cors())//CROS許可
app.use(multer().none()) // multerでブラウザから送信されたデータを解釈する
//サーバの受付ポート番号
const port = 4141
app.listen(port, ()=>{
console.log(`http://localhost:${port} でリクエストを受け付けます。`)
})
//Async/Awaitを使ったMySQL接続情報★★★★★★★★★★★★★★★★★★★★★
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
const pool_config = {
host: 'xxxxx',
user: 'xxxxx',
password: 'xxxx',
port: 8889,
database: 'xxxx',
timezone: 'xxxx' //timezoneの指定省略の場合はシステムローカルになる
}
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
//★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
//汎用的にMySQLクエリを発行する関数
// (mysqlモジュールをラップして使いやすくする)
const runQuery = async (sql, data) => {
console.log('runQuery...')
console.log('sql: ' + sql)
console.log('data: ' + data)
const pool = mysql.createPool(pool_config)
try {
pool.query = util.promisify(pool.query)//これないと動かない
const run_sql = mysql.format(sql, data)
console.log('発行されたquery:\n' + run_sql + '\n')
const result = await pool.query(run_sql)
// console.log(JSON.stringify(result))
pool.end() // mysqlのコネクションのプロセスを終了させる。
return result
} catch (e) {
//エラーが発生した場合でもMySQLのconnectionプロセスを終了させる
pool.end() // mysqlのコネクションのプロセスを終了させる。
}
}
app.get('/', (request, response, next) => {
(async () => {
console.log('「/」へ GETリクエストがありました。')
//汎用的にMySQLクエリを発行する
// ?? のところに users が代入されます
//await async を使うことでコールバック関数が不要になり、見やすくなります。
const sql_result = await runQuery(
'select * from ??',
['users']
)
console.log('SQL 結果')
console.table(sql_result)
//レスポンスを返す
response.json(sql_result)
//↓これでも動きます!
// response.send(JSON.stringify(sql_result))
})(next).catch((e) => {
//エラー処理
console.log('サーバエラーが発生しました')
console.log(e)
response.json({
message: 'サーバエラーが発生しました。' + e,
})
})
})