Mongoose: Preserve isNew-Zustand nach dem Speichern

Erstellt am 7. Mai 2013  ·  14Kommentare  ·  Quelle: Automattic/mongoose

Es ist immer noch wichtig zu wissen, ob das Objekt in der Post-Save-Middleware jetzt neu war. Ich glaube, es ist auf „false“ gesetzt. Es sollte nach dem Post-Save auf „false“ gesetzt werden.

new feature

Hilfreichster Kommentar

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

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

Alle 14 Kommentare

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

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

Führt dies dazu, dass die Eigenschaft wasNew bestehen bleibt?

nicht, es sei denn, Sie fügen es Ihrem Schema hinzu

Hallo,

Ich versuche, dies in einem Code zu verwenden, den ich habe, aber ich weiß nicht, warum das nicht funktioniert. Im Pre-Save wird wasNew erstellt und ist wahr. Aber beim Post-Save ist dieses Flag nicht definiert (also bekomme ich ein undefined).

Irgendetwas mache ich falsch? Es ist, als ob der Gültigkeitsbereich von _this_ zwischen beiden Funktionen nicht beibehalten (oder gebunden) wird.

Ich habe versucht, Mongoose-Versionen zu installieren, eine von npm ('3.9.8-pre') und die andere aus diesem Repo erstellt ... Hat jemand irgendwelche Vorschläge?

Ich habe verstanden, dass mein Schema kein _wasNew_-Feld enthalten muss, ist das richtig?

Vielen Dank im Voraus!

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

Hallo nochmal, ich habe _this.wasNew_ in _doc.wasNew_ geändert und jetzt funktioniert es erfolgreich! Und das Feld wird nicht wie erforderlich im Dokument gespeichert.

Das ist richtig, oder?

Danke!

Ja :)

Leute, dieser Tweak sollte wirklich als Standard für jedes Schema zum aktuellen Zweig hinzugefügt werden.

Gibt es einen Grund, warum wasNew nicht eingebaut werden sollte? Sollten wir es Mungo hinzufügen?

Vernünftige Idee, wir werden sie für spätere 5.x-Releases in Betracht ziehen.

Hallo zusammen !

Irgendein Update für diese eingebaute Funktion?

wasNew ist auf Mongoose _(5.4.19)_ nicht vorhanden, wenn ich versuche, ein neues Dokument zu speichern

@darkterra wasNew ist nicht vorhanden, Sie müssen es in pre erstellen und können es dann in post verwenden, wie im obigen Kommentar erwähnt https://github.com/Automattic/ Mungo/issues/1474#issuecomment -17669982

@thakurinbox , danke für deine Antwort.

Wenn ich das richtig verstehe, lautet die Frage des ursprünglichen Posts " Preserve isNew _in the postSave hook_", dann scheinen @emanuelecasadio , @lbstr und @vkarpov15 zu sagen, dass es schön wäre, diese Daten in "postSave" _ ( ob es die Eigenschaft 'isNew' oder 'wasNew' ist) _.

Ich habe kein 'isNew' oder 'wasNew', also habe ich mich gefragt, ob die Eigenschaft 'isNew' nicht mehr existiert und durch die Zukunft durch 'wasNew' ersetzt wird?

_Kleines Stück 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 :)')
    }
  });
})

_Und kein isNew oder warNew dort:_

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, offensichtlich kann die Konsole mir die anderen Eigenschaften des Objekts sowie diese Methoden nicht anzeigen, aber ich versuche, "this.isNew" und "this.isModified ()" im PreSave aufzurufen, und ich habe etwas, das erscheint in der Konsole ...

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

Ich bestätige also, dass der Trick in dieser Ausgabe gut funktioniert. Andererseits bin ich mir sicher, dass die Konsole in der Vergangenheit die Funktionen und andere Eigenschaften des von Mongoose überdefinierten Objekts anzeigen konnte.

Es gibt noch keine Updates für diese Funktion, deshalb ist dieses Thema noch offen :+1: . Die manuelle Einstellung von wasNew in Pre-Save ist vorerst der richtige Weg

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen