MySQLのバージョンって8じゃないの?
今回扱うのはNodeJSでMySQLとの接続を扱うライブラリです。
Node-mysql2
元々本家のmysqlライブラリを使っていたのですが、
古いcallbackをasync/await
に書き換えるついでに
mysql2パッケージに移行することにしました。
特に今回はinsertのロジックの実装の際にtransaction処理が必要になりました。
async/awaitで読みやすくします。(最後の全体のコード参照)
query()はSQLインジェクションができてしまうようです。
Execute - no possibly sql injection
query - possibly sql injection
mysql2ではrows
とfields
というプロパティが返却されてくるので
コードを対応させます。従来のデータはrows
に入っています。
const [rows,fields] = await conn.execute(
query,
this.convertUndefToNull(params)
)
SQLのパラメータにundefined
を渡すと、mysql側で内部的にnull
に変換してくれていた処理が、mysql2では明示的にnull
を渡せと言われます。
変換するメソッドを作ります。
/**
* paramに含まれるundefをnullに置き換えるメソッド
* @param {any[]} param
*/
public convertUndefToNull(param){
for(let i=0; i < param.length; i++){
if(param[i] === undefined){
param[i] = null
}
}
return param
}
public insertQuery(query:string,params:any[]){
return new Promise(async(resolve,reject)=>{
let conn = await pool.getConnection()
try {
await conn.beginTransaction();
const [rows,fields] = await conn.execute(
query,
this.convertUndefToNull(params)
)
await conn.commit()
console.log(rows)
resolve(rows)
} catch (error) {
await conn.rollback()
reject(error)
} finally{
await conn.release()
}
})
}
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント