Sequelize – actualizează înregistrarea și returnează rezultatul (Programare, Javascript, Sequelize.Js)

Wexoni a intrebat.

Folosesc sequelize cu MySQL. De exemplu, dacă fac:

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);
    });

Nu primesc înapoi informații dacă modelul de persoane a fost actualizat cu succes sau nu. Rezultatul variabila este doar o matrice cu un singur element, 0=1

Cum pot ști cu certitudine că înregistrarea a fost actualizată sau nu.

8 răspunsuri
nickang

Uite ce cred că cauți.

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
});

Din Sequelize docs:Promisiunea returnează o matrice cu unul sau două elemente. Primul element x este întotdeauna numărul de rânduri afectate, în timp ce al doilea element y este numărul efectiv de rânduri afectate (acceptat numai în postgres cu options.returning setat la true.)

Presupunând că folosiți Postgres, puteți accesa obiectul actualizat cu result[1].dataValues.

Trebuie să setați returning: true pentru a-i spune lui Sequelize să returneze obiectul. Și plain: true este doar pentru a returna obiectul în sine și nu alte meta-date care ar putea să nu fie utile.

Comentarii

  • Eu folosesc MySQL. O voi testa cu. Vă mulțumim pentru răspuns –  > Por Wexoni.
  • 23

  • Nu am reușit să o fac să funcționeze cu MySql. Cred că aceasta este doar o caracteristică Postgresql 🙁 –  > Por Wexoni.
  • De asemenea, în ciuda a ceea ce spune documentația, primesc undefined ca prim parametru și se obține numărul de rânduri afectate ca al doilea parametru (folosind sqlite). Pentru a rezolva acest lucru am făcut result = result.filter(Boolean); înainte de a procesa ceva. –  > Por Ryan Wheale.
  • Există o modalitate de a specifica coloanele returnate? Lucrez cu Postgress –  > Por Uri Abramson.
  • ce înseamnă x în „[x, y] dacă folosiți Postgres” ? –  > Por stackdave.
David Dehghan

Puteți găsi elementul și să-i actualizați proprietățile și apoi să-l salvați. Salvarea() are ca rezultat o interogare UPDATE către baza de date

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();

Pe Postgres:

Executing (default): UPDATE "jobs" SET "payload"=$1,"updatedAt"=$2 WHERE "id" = $3

Comentarii

  • Aceasta este cea mai curată soluție care funcționează în mod universal. Vă mulțumim. –  > Por JoshL.
Tilekbekov Yrysbek

Funcția de actualizare a sequelize returnează un număr de rânduri afectate (primul parametru al tabloului de rezultate).

Ar trebui să apelați find pentru a obține rândul actualizat

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);
      });

Comentarii

  • Deci, se pare că singura modalitate este să apelați find imediat după actualizare? –  > Por Wexoni.
  • oricum ar trebui să folosiți funcția find. –  > Por Tilekbekov Yrysbek.
  • puteți apela find mai întâi, apoi efectuați actualizarea cu acest obiect fără a utiliza funcția where –  > Por Tilekbekov Yrysbek.
  • dacă folosiți PostgreSQL, puteți defini returning opțiunea de true care să returneze rândurile afectate –  > Por Tilekbekov Yrysbek.
Bharat Suryawanshi

același lucru pe care îl puteți face cu async-await, în special pentru a evita promisiunile imbricateTrebuie doar să creați funcția async 🙂

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)
    }
} 

Anoop P S

În cele din urmă am înțeles. returnând true nu va funcționa în mysql, trebuie să folosim findByPk în ordine sper că acest cod va ajuta.

       return new Promise(function(resolve, reject) {
User.update({
        subject: params.firstName, body: params.lastName, status: params.status
    },{
        returning:true,
        where: {id:id }                             
    }).then(function(){
        let response = User.findById(params.userId);                      
        resolve(response);
    }); 

});

ns16

Există o altă modalitate – utilizați findByPk metoda statică și update metoda non-statică împreună. De exemplu:

let person = await models.People.findByPk(peopleInfo.scenario.id);
if (!person) {
  // Here you can handle the case when a person is not found
  // For example, I return a "Not Found" message and a 404 status code
}
person = await person.update({ OwnerId: peopleInfo.newuser });
response(person).code(200);

Rețineți că acest cod trebuie să fie în interiorul unei funcții asincrone.

Comentarii

  • Cel mai bun răspuns de până acum –  > Por rofrol.
SuperZZ

Poți să aduci mai întâi modelul de actualizat și să apelezi set() apoi save() pe el. Returnarea acestui obiect vă va oferi modelul actualizat.

Deși s-ar putea să nu fie cel mai scurt mod de a face acest lucru, îl prefer pentru că poți gestiona separat erorile de tip not found și update.

const instance = await Model.findOne({
  where: {
    'id': objectId
  }
});

if (instance && instance.dataValues) {
  instance.set('name', objectName);
  return await instance.save(); // promise rejection (primary key violation…) might be thrown here
} else {
  throw new Error(`No Model was found for the id ${objectId}`);
}

Basanta Kc

Dacă folosiți postgres și actualizați un singur rând.

  try {
    const result = await MODELNAME.update(req.body, {
      where: { id: req.params.id },
      returning: true
    });
    if (!result) HANDLEERROR()
    const data = result[1][0].get();

    res.status(200).json({ success: true, data });
  } catch (error) {
    HANDLEERROR()
  }