Mongoose: Conserver isNew state in post save

Créé le 7 mai 2013  ·  14Commentaires  ·  Source: Automattic/mongoose

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.

new feature

Commentaire le plus utile

schema.pre('save', function (next) {
  this.wasNew = this.isNew;
  next();
})

schema.post('save', function () {
  if (this.wasNew) {
     // ...
  }
})

Tous les 14 commentaires

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

Cette page vous a été utile?
0 / 5 - 0 notes