Impossible de récupérer la valeur précédente lors de la mise à jour
Je viens de commencer à convertir mon projet de MongoDB vers PostgreSQL en utilisant sequelizeet sequelize-typescriptet j'ai rencontré un problème:
J'ai créé avec MongoDB une méthode upsert qui utilise simplement findOneAndUpdate. Il trouve un seul utilisateur par son userId, si aucun n'est trouvé, il en crée un sinon il le met à jour avec un objet. Le retour valueest l'enregistrement avant d'être mis à jour. Facile non?
upsert: async (userId: string, obj: Partial<UserModel>) => {
const { value } = await this._users.findOneAndUpdate(
{ _id: userId },
{ $set: obj },
{ upsert: true }
);
return value!;
},
Maintenant, quand je veux utiliser sequelize, je dois d'abord utiliser findByPk(qui est l'userId) car findOrCreatec'est assez lent (mon application s'est déjà plantée plusieurs fois à cause du délai d'attente), puis si un enregistrement est trouvé, je le mets à jour avec un objet sinon j'utilise <Model>.create. Le fait est que <Model>.updatene renvoie pas la valeur précédente, .previous()renvoie des parenthèses vides.
Voici la méthode avec laquelle je travaille actuellement:
upsert: async (userId: string, obj: Partial<User>): Promise<User | null> => {
const user = await User.findByPk(userId);
if (user) {
console.log(1, user);
if (user.login!== obj.login) {
const test = await user.update(obj);
console.log(2, test);
console.log(3, test.previous());
}
return user;
}
return await User.create(obj)
.catch(() => null)
.finally(() => null);
},
Voici la sortie de la console :

Est-ce que je manque un point clé ici? Ou n'est-ce même pas possible? Je fouille dans les docs et globalement sur Google et je n'ai rien trouvé à ce sujet
Solution du problème
Il n'y a aucun moyen d'obtenir les valeurs précédentes à partir de update. Vous devez stocker userdes accessoires quelque part avant d'appelerupdate :
const oldUser = user.get({ plain: true });
if (user.login!== obj.login) {
const test = await user.update(obj);
console.log(2, test);
console.log(3, oldUser);
}
Quant à previous()lui, il renvoie les valeurs d'origine ou précédemment enregistrées avant tout setappel et jusqu'à ce savequ'il soit appelé.
Commentaires
Enregistrer un commentaire