Mongoose: المحافظة هي حالة جديدة في حفظ ما بعد

تم إنشاؤها على ٧ مايو ٢٠١٣  ·  14تعليقات  ·  مصدر: Automattic/mongoose

لا يزال من المهم معرفة ما إذا كان الكائن جديدًا في المنشور باستثناء البرامج الوسيطة في الوقت الحالي ، وأعتقد أنه تم تعيينه على خطأ ، فيجب ضبطه على خطأ بعد حفظ المنشور.

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 وهو صحيح. ولكن في ما بعد الحفظ ، لم يتم تعريف هذه العلامة (لذلك أحصل على غير محدد).

هناك شيء أفعله خطأ؟ يبدو الأمر كما لو أن نطاق _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 ، شكرًا لك على ردك.

إذا فهمت بشكل صحيح ، فإن السؤال المتعلق بالمنشور الأصلي هو "الاحتفاظ بجديد _ في postSave 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 :)')
    }
  });
})

_لا يوجد جديد أو كان جديدًا هناك: _

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 التقييمات