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 :

entrez la description de l'image ici

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

Posts les plus consultés de ce blog

Erreur Symfony : "Une exception a été levée lors du rendu d'un modèle"

Détecter les appuis sur les touches fléchées en JavaScript

Une chaîne vide donne "Des erreurs ont été détectées dans les arguments de la ligne de commande, veuillez vous assurer que tous les arguments sont correctement définis"