Node.js の mysql2 パッケージを使うと同期処理がうまくいく
Node.js の MySQL パッケージは mysql2 がいい。だいたいの記事で mysql のパッケージが紹介されているが、同期処理で苦労する。
データベースに接続して select のクエリを処理し、取得したデータを別の処理にわたすような場合、一連の処理は同期している必要がある。しかし mysql パッケージでは、クエリの処理が完了する前に次の関数が動いてしまうように見える。きちんと書けばうまくいくと思うが、その書き方が結局わからなかった。
mysql2 では次のようにする。
const mysql = require('mysql2/promise')
async function connect() {
let conn
try {
id = 1
conn = await mysql.createConnection({
host: '',
user: '',
password: '',
database: ''
})
const [rows, fields] = await conn.execute('select val from sample where id = ?', [id])
return rows
} catch (e) {
console.log(e)
return ''
} finally {
if (conn && conn.connection) {
conn.end()
}
}
重要な同期は
- createConnection
- execute
で、単に await をつければいい。この execute は prepared statement にも対応している。上のコードは mysql パッケージだとうまく機能しない。クエリの処理が終わる前にリターンが動いて、空っぽのデータを返してしまう。