今日ほぼ1日ここにハマりました。
@Transaction()
async _update(id: string, status: string, @TransactionManager() manager?: EntityManager): Promise<void> {
if ( manager === undefined) {
throw new Error('DB not getting TransactionManager.');
}
const res = await manager.findOneOrFail(Job, id);
res.status = status;
res.save();
}
要するには、上記のようなコード書いたら、
local開発やmcr.microsoft.com/azure-functions/node:3.0-node12
のようなdocker使って開発するのは全然OKのだが、いざazure functionsにデプロイすると、意味不明な下記エラーが出ます。
2021-11-12T15:20:38Z [Information] Error: TypeORMError: Connection is not established with mysql database
at new TypeORMError (/home/site/wwwroot/node_modules/typeorm/error/TypeORMError.js:9:28)
at /home/site/wwwroot/node_modules/typeorm/driver/mysql/MysqlDriver.js:668:22
at new Promise (<anonymous>)
at MysqlDriver.obtainMasterConnection (/home/site/wwwroot/node_modules/typeorm/driver/mysql/MysqlDriver.js:656:16)
at MysqlQueryRunner.connect (/home/site/wwwroot/node_modules/typeorm/driver/mysql/MysqlQueryRunner.js:59:58)
at MysqlQueryRunner.<anonymous> (/home/site/wwwroot/node_modules/typeorm/driver/mysql/MysqlQueryRunner.js:208:63)
at step (/home/site/wwwroot/node_modules/tslib/tslib.js:143:27)
at Object.next (/home/site/wwwroot/node_modules/tslib/tslib.js:124:57)
at /home/site/wwwroot/node_modules/tslib/tslib.js:117:75
at new Promise (<anonymous>)
transaction
以外のDB操作が少なくて(唯一のDBの読み取り操作も別の原因で振る舞いが狂って、接続ができたと言う確信が持たなくて)、全然azure functions
とtypeorm
のせいだと思わずに、黙々接続情報やenvなどをデバッグしていた1日でした。
多分@Transaction()
デコレータを使わずに、普通にconn.transaction
すれば普通にいけると思うけど、今日はもうここまでにして。。。
別途azureとtypeormのgitにissueを出しますが、まずここにまとめます。同じ地雷を踏んで調べている人がいれば、少しでも時間節約できたら幸いです。
typeorm version 0.2.38
azure functions:
Runtime version:3.3.1.0,
FUNCTIONS_EXTENSION_VERSION: ~3,
Operating System: Linux
github actionsのAzure/functions-action@v1を使ってデプロイしている