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.
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
Comentários muito úteis