मैं नेवला में उपलब्ध presave हुक का उपयोग कर एक सरणी अद्यतन करने के लिए कोशिश कर रहा हूँ। मैं ऑडिट उद्देश्यों के लिए इस सरणी का उपयोग कर रहा हूं और इसलिए मैं इन मध्यम मालों का उपयोग करके सही मूल्यों को लागू करना चाहता था

यहाँ मेरी स्कीमा है

const taskSchema = new mongoose.Schema({
id: { type: String, required: true },
status: { type: String, required: true },
code: { type: String, required: true }, // ENQUIRY
events:{
    type:[{
            status: {type: String, required: true},
            date:{ type: Date, required: true}

    }], required: false
},
assignedTo: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: false },
}, {timestamps:true});

मिडलवेयर हुक को बचाने में तर्क बहुत अच्छा काम करता है।

taskSchema.pre('save', async function(next) {
    try {
        let event = {}
        let now = Date.now();
        event.status = this.status;
        event.date = now;
        this.events.push(event);
        next();
    } catch (error) {
        console.log(error);
        next(error);
    }
});

FindOneAndUpdate हुक में उपयोग किए जाने पर त्रुटि

taskSchema.pre('findOneAndUpdate', async function(next) {
    try {

        let event={}
        let now = Date.now();
        event.status = this._update.status;
        event.date = now;
        this.events.push(event);
        next();
    } catch (error) {
        console.log(error);
        next(error);
    }
});

मुझे यकीन नहीं है कि मैं यहाँ क्या खो रहा हूँ। यहाँ त्रुटि है

TypeError: Cannot read property 'push' of undefined 

मैं देख रहा हूँ कि this.events अपरिभाषित है।

मैं उस सरणी को अद्यतन करने के लिए कैसे एक्सेस करूं? अनुरोध में जो कुछ भी भेजा जाता है उसे मुझे भी अनदेखा करना चाहिए।body.events

अग्रिम में धन्यवाद।

1
josiebhai 4 अगस्त 2019, 22:42

1 उत्तर

सबसे बढ़िया उत्तर

प्रकार के मिडलवेयर का संदर्भ लें, save है < मजबूत>दस्तावेज़ मिडलवेयर और findOneAndUpdate क्वेरी मिडलवेयर है। और नोट्स में, यह कहता है कि:

क्वेरी मिडलवेयर दस्तावेज़ मिडलवेयर से सूक्ष्म लेकिन महत्वपूर्ण तरीके से भिन्न होता है: दस्तावेज़ मिडलवेयर में, this दस्तावेज़ को अद्यतन करने के लिए संदर्भित करता है। क्वेरी मिडलवेयर में, नेवला के पास आवश्यक रूप से दस्तावेज़ को अद्यतन करने का संदर्भ नहीं होता है, इसलिए this दस्तावेज़ को अद्यतन किए जाने के बजाय क्वेरी ऑब्जेक्ट को संदर्भित करता है।

तो आपके findOneAndUpdate प्री में, this.events undefined है।

आपके मामले में, नीचे दिए गए कोड का उपयोग करने से समस्या हल हो सकती है:

taskSchema.pre('findOneAndUpdate', async function(next) {
  try {

    let event={}
    let now = Date.now();
    event.status = this._update.status;
    event.date = now;
    this._update['$push'] = {events: event};
    next();
  } catch (error) {
    console.log(error);
    next(error);
  }
});
1
Cuong Le Ngoc 5 अगस्त 2019, 12:28