J'utilise sequelize avec MySQL. Par exemple si je le fais:
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);
});
Je ne récupère pas d'informations si le modèle de personnes a été mis à jour avec succès ou non. Le résultat de la variable est juste un tableau avec un élément, 0 = 1
Comment puis-je savoir avec certitude que l'enregistrement a été mis à jour ou non.
Voici ce que je pense que vous recherchez.
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
});
De Sequelize docs : La promesse renvoie un tableau avec un ou deux éléments. Le premier élément x
correspond toujours au nombre de lignes affectées, tandis que le deuxième élément y
correspond aux lignes réellement affectées (uniquement pris en charge dans postgres avec options.returning
réglé sur true
.)
En supposant que vous utilisez Postgres, vous pouvez accéder à l'objet mis à jour avec result[1].dataValues
.
Vous devez définir returning: true
option pour indiquer à Sequelize de renvoyer l'objet. Et plain: true
est juste pour renvoyer l'objet lui-même et non les autres métadonnées en désordre qui pourraient ne pas être utiles.
La fonction de mise à jour de sequelize renvoie un nombre de lignes affectées (premier paramètre du tableau de résultats).
Vous devriez appeler find pour obtenir la ligne mise à jour
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);
});
Vous pouvez simplement trouver l'élément et mettre à jour ses propriétés, puis l'enregistrer. Save () génère une requête UPDATE sur la base de données
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();
Sur Postgres:
Executing (default): UPDATE "jobs" SET "payload"=$1,"updatedAt"=$2 WHERE "id" = $3
vous pouvez faire la même chose avec async-wait, en particulier pour éviter les promesses imbriquées. Il vous suffit de créer une fonction asynchrone :)
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)
}
}