今回はsequelizeでsaveの返り値をとる話。
経緯
現在sequelizeを使っていてデータを更新するAPIを作っていたが「データの反映が遅い」という指摘があった。
そのコードを見ると
userGold = user.findOne({ where: id:1 });
User.update(
{ gold: userGold + 1 },
{ where: { id: 1 } }
)
みたいなコードだった。(userテーブルが持っているgoldをこのリクエストが流れる度に+1されるみないなやつ)
なにがダメなん?
もともとデータベースにuserのgoldが5というデータが入っているとして、このリクエストを送ると
レスポンスで返ってくるuserのgoldは5なのだ。だけどデータベースを更新すると6になっている。
そしてもう一回リクエストを送るとレスポンスは6が返ってきて、データベースは7になっている。
なんだかワンクッション遅れている感じ
やりたいこと
元々データベースにuserのgoldが5というものがあれば、リクエストを送るとレスポンスはuserのgoldは6が返ってきてほしい。
解決策(saveを使う)
こんな感じに書き換えたら理想の動作が実現しました。
const user = await User.findOne({ where: id: 1}).then((user) => {
user.gold = user.gold + 1;
user.save();
return user;
});
一応解説
const (定数名)= await (テーブル名).findOne({ where:(探したいレコードの条件)).then((user) => {
//ブロックにそれぞれ代入するような感じにして最後にsave()をする。
んで、それをリターンして定数名をそれにする。
user.gold = user.gold + 1;
user.save();
return 定数がこの値になる;
});
コメント