Mongoose: Preservar isNew state in post save

Criado em 7 mai. 2013  ·  14Comentários  ·  Fonte: Automattic/mongoose

Ainda é importante saber se o objeto era novo no middleware post save agora eu acredito que está definido como false, deve ser definido como false após o salvamento do post.

new feature

Comentários muito úteis

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

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

Todos 14 comentários

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

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

Isso faz com que a propriedade wasNew persista?

não, a menos que você o adicione ao seu esquema

Oi,

Estou tentando usar isso em um pedaço de código que tenho, mas não sei por que isso não está funcionando. Em pré-save wasNew é criado e é true. Mas no post-save, esse sinalizador não está definido (então recebo um indefinido).

Há algo que estou fazendo de errado? É como se o escopo de _this_ não fosse preservado (ou vinculado) entre as duas funções.

Eu tentei versões do mangusto, uma instalada a partir do npm ('3.9.8-pre') e outra construída a partir deste repositório... Alguém tem alguma sugestão?

Entendi que meu Schema não precisa conter um campo _wasNew_, certo?

Desde já, obrigado!

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

Olá novamente, alterei o _this.wasNew_ para _doc.wasNew_ e agora está funcionando com sucesso! E o campo não fica armazenado no documento, pois era obrigatório.

Isso está correto, não é?

Obrigado!

Sim :)

Pessoal, esse tweak realmente deve ser adicionado ao branch atual como padrão para cada esquema.

Alguma razão pela qual wasNew não deveria ser embutido? Devemos adicioná-lo ao mangusto?

Idéia razoável, vamos considerá-la para versões 5.x posteriores.

Olá pessoal !

Alguma atualização para este recurso embutido?

wasNew não está presente no mangusto _(5.4.19)_ quando tento salvar um novo documento

@darkterra wasNew não está lá, você precisa criá-lo dentro pre e então pode usar dentro de post como mencionado no comentário acima https://github.com/Automattic/ mangusto/issues/1474#issuecomment -17669982

@thakurinbox , obrigado pela sua resposta.

Se entendi corretamente a pergunta do post original é "preservar isNew _in the postSave hook_", então @emanuelecasadio , @lbstr e @vkarpov15 parecem dizer que seria bom ter embutido esses dados em" postSave " _ ( se é a propriedade 'isNew' ou 'wasNew') _.

Eu não tenho 'isNew' ou 'wasNew', então me perguntei se a propriedade 'isNew' não existe mais e será substituída pelo futuro por 'wasNew'?

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

_E não éNovo ou eraNovo lá:_

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, o console não consegue me mostrar a outra propriedade do objeto assim como esses métodos, mas eu tento chamar "this.isNew" e "this.isModified()" no preSave e tenho algo que aparece no 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();
  });

Portanto, confirmo que o truque nesta edição funciona bem. Por outro lado, no passado, tenho certeza de que o console poderia exibir as funções e outras propriedades do objeto definido pelo Mongoose.

Ainda não há atualizações sobre este recurso, é por isso que este problema ainda está aberto :+1: . Definir manualmente wasNew no pré-salvar é o caminho a seguir por enquanto

Esta página foi útil?
0 / 5 - 0 avaliações