Il est toujours important de savoir si l'objet était nouveau dans le middleware de post-sauvegarde en ce moment, je crois qu'il est défini sur false, il devrait être défini sur false après la sauvegarde de la publication.
schema.pre('save', function (next) {
this.wasNew = this.isNew;
next();
})
schema.post('save', function () {
if (this.wasNew) {
// ...
}
})
Cela entraîne-t-il la persistance de la propriété wasNew ?
pas sauf si vous l'ajoutez à votre schéma
Salut,
J'essaie de l'utiliser dans un morceau de code que j'ai, mais je ne sais pas pourquoi cela ne fonctionne pas. Dans la pré-sauvegarde, wasNew est créé et est vrai. Mais en post-sauvegarde, ce drapeau n'est pas défini (donc j'obtiens un indéfini).
Il y a quelque chose que je fais mal? C'est comme si la portée de _this_ n'était pas préservée (ou liée) entre les deux fonctions.
J'ai essayé de monter des versions, l'une installée à partir de npm ('3.9.8-pre') et l'autre construite à partir de ce dépôt... Quelqu'un a-t-il des suggestions ?
J'ai compris que mon schéma n'a pas besoin de contenir un champ _wasNew_, n'est-ce pas ?
Merci d'avance!
Code:
module.exports = function (schema) {
log.info("Inside functions");
schema.pre('save', function (next) {
log.info('pre saving...');
this.wasNew = this.isNew;
var self = this;
if (self.isNew) {
self.information.token = require('crypto').randomBytes(48).toString('hex');
self.profile.name = (self.email.split("@"))[0];
}
next();
});
schema.post('save', function (doc) {
log.info('post saving...', this);
if (this.wasNew) {
log.info("Sending email");
mailingService.welcome(this.email);
}
var bond = {
"name": doc.profile.name,
"owner": doc._id
};
log.info(bond);
dbHelper.createBond(bond);
});
};
Salut à nouveau, j'ai changé le _this.wasNew_ en _doc.wasNew_ et fonctionne maintenant avec succès ! Et le champ n'est pas stocké dans le document, comme il était requis.
C'est exact, n'est-ce pas ?
Merci!
Ouais :)
Les gars, ce réglage devrait vraiment être ajouté à la branche actuelle par défaut pour chaque schéma.
Une raison pour laquelle wasNew
ne devrait pas être intégré ? Doit-on l'ajouter à la mangouste ?
Idée raisonnable, nous l'envisagerons pour les versions 5.x ultérieures.
Bonjour tous le monde !
Une mise à jour pour cette fonctionnalité intégrée ?
wasNew
n'est pas présent sur la mangouste _(5.4.19)_ lorsque j'essaie d'enregistrer un nouveau document
@darkterra wasNew
n'est pas là, vous devez le créer à l'intérieur pre
et que vous pouvez utiliser à l'intérieur post
comme mentionné dans le commentaire ci-dessus https://github.com/Automattic/ mangouste/issues/1474#issuecomment -17669982
@thakurinbox , merci pour votre réponse.
Si je comprends bien la question du message d'origine est de "conserver isNew _in the postSave hook_", alors @emanuelecasadio , @lbstr et @vkarpov15 semblent dire qu'il serait bien d'avoir intégré ces données dans "postSave" _ ( que ce soit la propriété 'isNew' ou 'wasNew') _.
Je n'ai pas 'isNew' ou 'wasNew', donc je me suis demandé si la propriété 'isNew' n'existe plus et sera remplacée par le futur par 'wasNew'?
_Petite paix de code :_
'use strict';
const mongoose = require('mongoose'); // v5.4.19
const connect = mongoose.connect('mongodb://localhost/test_mongoose', { useNewUrlParser: true });
console.log('mongoose connect: ', connect);
connect.then(connectionObject => {
const Schema = mongoose.Schema;
const BlogPost = new Schema({
title: String,
body: String,
date: Date
});
BlogPost.pre('save', function(next, doc, err) {
console.log('pre: this: ', this);
console.log('pre: doc: ', doc);
next();
});
BlogPost.post('save', function(doc, next) {
console.log('post: this: ', this);
console.log('post: doc: ', doc);
next();
});
const BlogModel = mongoose.model('BlogPost', BlogPost);
const newBlogPost = new BlogModel({
title: 'This is a test',
body: 'This is the BEST POST ever !!!!!',
date: new Date()
});
console.log('newBlogPost: ', newBlogPost);
newBlogPost.save((err, doc) => {
if (err) {
console.error(err);
}
else
{
console.log('callback SAVE: ', doc);
console.log('Post SAVED :)')
}
});
})
_Et il n'y a ni isNew ni wasNew :_
mongoose connect: Promise { <pending> }
newBlogPost: { _id: 5c90aeb34f000a254ed2b6f7,
title: 'This is a test',
body: 'This is the BEST POST ever !!!!!',
date: 2019-03-19T08:56:19.011Z }
pre: this: { _id: 5c90aeb34f000a254ed2b6f7,
title: 'This is a test',
body: 'This is the BEST POST ever !!!!!',
date: 2019-03-19T08:56:19.011Z }
pre: doc: SaveOptions {}
post: this: { _id: 5c90aeb34f000a254ed2b6f7,
title: 'This is a test',
body: 'This is the BEST POST ever !!!!!',
date: 2019-03-19T08:56:19.011Z,
__v: 0 }
post: doc: { _id: 5c90aeb34f000a254ed2b6f7,
title: 'This is a test',
body: 'This is the BEST POST ever !!!!!',
date: 2019-03-19T08:56:19.011Z,
__v: 0 }
callback SAVE: { _id: 5c90aeb34f000a254ed2b6f7,
title: 'This is a test',
body: 'This is the BEST POST ever !!!!!',
date: 2019-03-19T08:56:19.011Z,
__v: 0 }
Post SAVED :)
Ok, évidemment, la console n'arrive pas à me montrer l'autre propriété de l'objet ainsi que ces méthodes, mais j'essaie d'appeler "this.isNew" et "this.isModified()" dans le preSave et j'ai quelque chose qui apparaît dans la console...
BlogPost.pre('save', function(next, doc, err) {
console.log('pre: this: ', this);
console.log('pre: doc: ', doc);
console.log('pre: this.isNew: ', this.isNew); // true
console.log('pre: this.isModified(): ', this.isModified()); // true
this.wasNew = this.isNew;
console.log('pre: this.wasNew: ', this.wasNew); // true
next();
});
Donc, je confirme que l'astuce dans ce numéro fonctionne bien. Par contre, par le passé, je suis sûr que la console pouvait afficher les fonctions et autres propriétés de l'objet sur-défini par Mongoose.
Aucune mise à jour sur cette fonctionnalité pour le moment, c'est pourquoi ce problème est toujours ouvert :+1: . Définir manuellement wasNew dans la pré-sauvegarde est la voie à suivre pour le moment
Commentaire le plus utile