web-dev-qa-db-fra.com

Sequelize - met à jour l'enregistrement et renvoie le résultat

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.

36
Vedran Maricevic.

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.

65
nickang

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);
      });
9
Tilekbekov Yrysbek

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
3
David Dehghan

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)
    }
} 
2
Bharat Suryawanshi