MySQLでsequelizeを使用しています。たとえば、私がする場合:
models.People.update({OwnerId: peopleInfo.newuser},
{where: {id: peopleInfo.scenario.id}})
.then(function (result) {
response(result).code(200);
}).catch(function (err) {
request.server.log(['error'], err.stack);
).code(200);
});
人物モデルが正常に更新されたかどうかに関係なく、情報を取得していません。変数の結果は、1つの要素(0 = 1)の配列です
レコードが更新されたかどうかをどのようにして確認できますか。
ここにあなたが探していると思うものがあります。
db.connections.update({
user: data.username,
chatroomID: data.chatroomID
}, {
where: { socketID: socket.id },
returning: true,
plain: true
})
.then(function (result) {
console.log(result);
// result = [x] or [x, y]
// [x] if you're not using Postgres
// [x, y] if you are using Postgres
});
Sequelizeから docs :promiseは、1つまたは2つの要素を持つ配列を返します。最初の要素x
は常に影響を受ける行の数であり、2番目の要素y
は実際に影響を受ける行です(options.returning
がtrue
に設定されたpostgresでのみサポートされます)
Postgresを使用している場合、result[1].dataValues
で更新されたオブジェクトにアクセスできます。
Sequelizeにオブジェクトを返すように指示するには、returning: true
オプションを設定する必要があります。また、plain: true
はオブジェクト自体を返すだけであり、役に立たない可能性のある他の乱雑なメタデータは返しません。
Sequelizeの更新関数は、影響を受ける行の数(結果配列の最初のパラメーター)を返します。
更新された行を取得するには、findを呼び出す必要があります
models.People.update({OwnerId: peopleInfo.newuser},
{where: {id: peopleInfo.scenario.id}})
.then(() => {return models.People.findById(peopleInfo.scenario.id)})
.then((user) => response(user).code(200))
.catch((err) => {
request.server.log(['error'], err.stack);
});
アイテムを見つけてプロパティを更新し、保存するだけです。 save()の結果、dbへのUPDATEクエリが発生します
const job = await Job.findOne({where: {id, ownerId: req.user.id}});
if (!job) {
throw Error(`Job not updated. id: ${id}`);
}
job.name = input.name;
job.payload = input.payload;
await job.save();
Postgresの場合:
Executing (default): UPDATE "jobs" SET "payload"=$1,"updatedAt"=$2 WHERE "id" = $3
async-awaitでできること、特に入れ子になったPromiseを避けるためにできること
const asyncFunction = async function(req, res) {
try {
//update
const updatePeople = await models.People.update({OwnerId: peopleInfo.newuser},
{where: {id: peopleInfo.scenario.id}})
if (!updatePeople) throw ('Error while Updating');
// fetch updated data
const returnUpdatedPerson = await models.People.findById(peopleInfo.scenario.id)
if(!returnUpdatedPerson) throw ('Error while Fetching Data');
res(user).code(200);
} catch (error) {
res.send(error)
}
}