Mongoose: Сохранить состояние isNew в пост-сохранении

Созданный на 7 мая 2013  ·  14Комментарии  ·  Источник: Automattic/mongoose

По-прежнему важно знать, был ли объект новым в промежуточном программном обеспечении после сохранения прямо сейчас, я считаю, что для него установлено значение false, после сохранения сообщения должно быть установлено значение false.

new feature

Самый полезный комментарий

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

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

Все 14 Комментарий

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

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

Приводит ли это к сохранению свойства wasNew?

нет, если вы не добавите его в свою схему

Привет,

Я пытаюсь использовать это в своем фрагменте кода, но я не знаю, почему это не работает. В предварительном сохранении создается wasNew и является истинным. Но при пост-сохранении этот флаг не определен (поэтому я получаю undefined).

Я что-то делаю не так? Это похоже на то, что область _this_ не сохраняется (или не связывается) между обеими функциями.

Я пробовал мангустовые версии, одна из которых была установлена ​​из npm («3.9.8-pre»), а другая — из этого репозитория... У кого-нибудь есть предложения?

Я так понял, что моя схема не обязательно должна содержать поле _wasNew_, верно?

Заранее спасибо!

Код:

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

Привет еще раз, я изменил _this.wasNew_ на _doc.wasNew_ и теперь успешно работает! И поле не сохраняется в документе, как это требовалось.

Это правильно, не так ли?

Спасибо!

Ага :)

Ребята, этот твик действительно должен быть добавлен в текущую ветку по умолчанию для каждой схемы.

Любая причина, по которой wasNew не следует встраивать? Должны ли мы добавить его к мангусту?

Разумная идея, мы рассмотрим ее для более поздних выпусков 5.x.

Всем привет !

Любое обновление для этой встроенной функции?

wasNew отсутствует в мангусте _(5.4.19)_, когда я пытаюсь сохранить новый документ

@darkterra wasNew там нет, вам нужно создать его внутри pre , а затем использовать внутри post , как указано в комментарии выше https://github.com/Automattic/ мангуст/проблемы/1474#issuecomment -17669982

@thakurinbox , спасибо за ответ.

Если я правильно понимаю, вопрос исходного поста заключается в том, чтобы "сохранить isNew _в посте Save hook_", то @emanuelecasadio , @lbstr и @vkarpov15 вроде бы говорят, что было бы неплохо встроить эти данные в "postSave" _( будь то свойство 'isNew' или 'wasNew') _.

У меня нет «isNew» или «wasNew», поэтому я задался вопросом, не существует ли свойство «isNew» больше и будет ли оно заменено в будущем на «wasNew»?

_Немного кода:_

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

_И ни isNew, ни 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 :)

Хорошо, очевидно, консоль не может показать мне другое свойство объекта, а также эти методы, но я пытаюсь вызвать «this.isNew» и «this.isModified()» в preSave, и у меня есть что-то, что появится в консоли...

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

Итак, я подтверждаю, что трюк в этом вопросе работает хорошо. С другой стороны, я уверен, что в прошлом консоль могла отображать функции и другие свойства объекта поверх определенных Mongoose.

Обновлений по этой функции пока нет, поэтому этот вопрос все еще открыт :+1: . Ручная установка wasNew в предварительном сохранении — это то, что нужно на данный момент.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги