Mongoose: Pertahankan status baru di pos simpan

Dibuat pada 7 Mei 2013  ·  14Komentar  ·  Sumber: Automattic/mongoose

Masih penting untuk mengetahui apakah objek itu baru di pos simpan middleware sekarang saya yakin itu disetel ke salah itu harus disetel ke salah setelah pos simpan.

new feature

Komentar yang paling membantu

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

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

Semua 14 komentar

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

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

Apakah ini menyebabkan properti wasNew bertahan?

tidak kecuali Anda menambahkannya ke skema Anda

Hai,

Saya mencoba menggunakan ini dalam sepotong kode yang saya miliki, tetapi saya tidak tahu mengapa ini tidak berhasil. Dalam pra-simpan wasNew dibuat dan benar. Tetapi di pasca-penyimpanan, bendera ini tidak ditentukan (jadi saya mendapatkan yang tidak terdefinisi).

Ada sesuatu yang saya lakukan salah? Ini seperti jika ruang lingkup _this_ tidak dipertahankan (atau diikat) di antara kedua fungsi.

Saya sudah mencoba versi luwak, satu diinstal dari npm ('3.9.8-pre') dan yang lainnya dibuat dari repo ini... Adakah yang punya saran?

Saya mengerti bahwa Skema saya tidak perlu berisi bidang _wasNew_, benar?

Terima kasih sebelumnya!

Kode:

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

Hai lagi, saya telah mengubah _this.wasNew_ menjadi _doc.wasNew_ dan sekarang berhasil! Dan bidang tidak disimpan dalam dokumen, seperti yang diperlukan.

Ini benar, bukan?

Terima kasih!

ya :)

Kawan, tweak ini harus benar-benar ditambahkan ke cabang saat ini sebagai default untuk setiap skema.

Adakah alasan mengapa wasNew tidak boleh dibangun? Haruskah kita menambahkannya ke luwak?

Ide yang masuk akal, kami akan mempertimbangkannya untuk rilis 5.x nanti.

Halo semua !

Adakah pembaruan untuk fitur bawaan ini?

wasNew tidak ada di luwak _(5.4.19)_ ketika saya mencoba menyimpan dokumen baru

@darkterra wasNew tidak ada, Anda perlu membuatnya di dalam pre dan kemudian dapat digunakan di dalam post seperti yang disebutkan dalam komentar di atas https://github.com/Automattic/ luwak/isu/1474#issuecomment -17669982

@thakurinbox , terima kasih atas tanggapan Anda.

Jika saya mengerti dengan benar pertanyaan dari posting asli adalah untuk "melestarikan isNew _di postSave hook_", maka @emanuelecasadio , @lbstr dan @vkarpov15 tampaknya mengatakan bahwa akan menyenangkan untuk membangun data ini di" postSave " _ ( apakah itu properti 'isNew' atau 'wasNew') _.

Saya belum 'isNew' atau 'wasNew', jadi saya bertanya-tanya apakah properti 'isNew' tidak ada lagi dan akan digantikan oleh 'wasNew' di masa depan?

_Sedikit ketenangan kode:_

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

_Dan tidak ada yang Baru atau Baru di sana:_

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 :)

Oke, tentu saja, konsol sepertinya tidak dapat menunjukkan kepada saya properti lain dari objek serta metode ini, tetapi saya mencoba memanggil "this.isNew" dan "this.isModified ()" di preSave dan saya memiliki sesuatu yang muncul di konsol ...

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

Jadi, saya mengonfirmasi bahwa trik dalam masalah ini berfungsi dengan baik. Di sisi lain, di masa lalu, saya yakin konsol dapat menampilkan fungsi dan properti lain dari objek yang ditentukan oleh Mongoose.

Belum ada pembaruan pada fitur ini, itu sebabnya masalah ini masih terbuka :+1: . Menyetel wasNew secara manual di pra-penyimpanan adalah cara yang harus dilakukan untuk saat ini

Apakah halaman ini membantu?
0 / 5 - 0 peringkat