Mongoose: Preservar el estado isNew en el post-guardado

Creado en 7 may. 2013  ·  14Comentarios  ·  Fuente: Automattic/mongoose

Todavía es importante saber si el objeto era nuevo en el middleware posterior al guardado en este momento. Creo que está configurado como falso, debe configurarse como falso después de guardarlo.

new feature

Comentario más útil

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

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

Todos 14 comentarios

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

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

¿Esto hace que la propiedad wasNew persista?

no a menos que lo agregue a su esquema

Hola,

Estoy tratando de usar esto en un código que tengo, pero no sé por qué no funciona. En el pre-guardado se crea wasNew y es verdadero. Pero en el post-guardado, esta bandera no está definida (así que obtengo un indefinido).

¿Hay algo que estoy haciendo mal? Es como si el alcance de _this_ no se conserva (o vincula) entre ambas funciones.

Intenté hacer versiones de mongoose, una instalada desde npm ('3.9.8-pre') y la otra creada a partir de este repositorio... ¿Alguien tiene alguna sugerencia?

Entendí que mi esquema no necesita contener un campo _wasNew_, ¿es así?

¡Gracias por adelantado!

Código:

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

Hola de nuevo, cambié _this.wasNew_ a _doc.wasNew_ y ahora funciona correctamente. Y el campo no se almacena en el documento, como se requería.

Esto es correcto, ¿no?

¡Gracias!

Sí :)

Chicos, este ajuste realmente debería agregarse a la rama actual como predeterminado para cada esquema.

¿Alguna razón por la que wasNew no debería incorporarse? ¿Deberíamos agregarlo a la mangosta?

Idea razonable, la consideraremos para versiones posteriores de 5.x.

Hola todos !

¿Alguna actualización para esta función incorporada?

wasNew no está presente en mongoose _(5.4.19)_ cuando trato de guardar un nuevo documento

@darkterra wasNew no está allí, debe crearlo dentro pre y luego puede usar dentro post como se menciona en el comentario anterior https://github.com/Automattic/ mangosta/problemas/1474#problemacomentario -17669982

@thakurinbox , gracias por tu respuesta.

Si entiendo correctamente, la pregunta de la publicación original es "preservar isNew _in the postSave hook_", entonces @emanuelecasadio , @lbstr y @vkarpov15 parecen decir que sería bueno haber incorporado estos datos en "postSave" _ ( ya sea la propiedad 'isNew' o 'wasNew') _.

No tengo 'isNew' o 'wasNew', así que me preguntaba si la propiedad 'isNew' ya no existe y será reemplazada en el futuro por 'wasNew'.

_Pequeña paz de código:_

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

_Y no es Nuevo ni era Nuevo ahí:_

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, obviamente, parece que la consola no puede mostrarme la otra propiedad del objeto así como estos métodos, pero trato de llamar a "this.isNew" y "this.isModified ()" en el guardado previo y tengo algo que aparece en la consola...

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

Entonces, confirmo que el truco en este problema funciona bien. Por otro lado, en el pasado, estoy seguro de que la consola podía mostrar las funciones y otras propiedades del objeto sobredefinido por Mongoose.

Aún no hay actualizaciones sobre esta función, es por eso que este problema aún está abierto :+1: . Configurar manualmente wasNew antes de guardar es el camino a seguir por ahora

¿Fue útil esta página
0 / 5 - 0 calificaciones