अद्यतन के लिए मैं निम्नलिखित कोड का उपयोग करता हूं जो काम करता है:

router.put('/:id', async (req, res) => {
  const { error } = validateProduct(req.body); 
  if (error) return res.status(400).send(error.details[0].message);

  const product = await Product.findByIdAndUpdate(req.params.id, 
    { 
     name: req.body.name,
     description: req.body.description,
     category: req.body.category,
     tags: req.body.tags,
     withdrawn: req.body.withdrawn,
     extraData: {
       brand: req.body.extraData.brand,
       quantity: req.body.extraData.quantity,
       type: req.body.extraData.type
     } 
   }, 
   {new: true}
  );

  if (!product) return res.status(404).send('The product with the given ID was not found.');

  res.send(product);
});

मैं जो करना चाहता हूं वह एक पैच ऑपरेशन बनाना है जो केवल कुछ फ़ील्ड अपडेट करता है और उन सभी को उपरोक्त अपडेट के रूप में नहीं। ये फ़ील्ड मानक नहीं हैं, लेकिन वे अद्यतन कार्रवाई के उपरोक्त क्षेत्रों में से एक हैं।

3
Giannis 17 फरवरी 2019, 18:13

2 जवाब

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

आप इस स्निपेट को आजमा सकते हैं (हालांकि स्थानीय रूप से इसका परीक्षण नहीं किया)। विचार केवल उत्पाद में उन क्षेत्रों को अद्यतन करना है, जिनका उल्लेख req.body में किया गया था। सुनिश्चित करें कि आपका सत्यापनकर्ता सुरक्षित है, अन्यथा आप नोस्क्ल इंजेक्शन के साथ समाप्त हो सकते हैं।

router.put('/:id', async (req, res) => {
  const { error } = validateProduct(req.body); 
  if (error) return res.status(400).send(error.details[0].message);

  const product = await Product.findById(req.params.id).exec();
  if (!product) return res.status(404).send('The product with the given ID was not found.');

  let query = {$set: {}};
  for (let key in req.body) {
    if (product[key] && product[key] !== req.body[key]) // if the field we have in req.body exists, we're gonna update it
       query.$set[key] = req.body[key];

  const updatedProduct = await Product.updateOne({_id: req.params.id}, query}).exec();

  res.send(product);
});

इसके अलावा, मुझे यकीन है कि आप लाइन में लॉश का लाभ उठा सकते हैं, जहां मैं फॉर-इन लूप का उपयोग करता हूं;)

इस दृष्टिकोण का नकारात्मक पक्ष यह है कि इसमें मोंगो के लिए 2 प्रश्न होते हैं, क्योंकि आपको चीज़ की तुलना करने के लिए एक वास्तविक दस्तावेज़ की आवश्यकता होती है। इसके अलावा अपडेट ऑपरेशन आपके मॉडल के पोस्ट सेव हुक को ट्रिगर नहीं करता है। यदि आपको उनकी आवश्यकता है - आपको पहले FindById() चाहिए, आवश्यक फ़ील्ड अपडेट करें और फिर आपको मिले दस्तावेज़ पर .save() दबाएं। आशा है कि इससे सहायता मिलेगी

5
Vladyslav Usenko 17 फरवरी 2019, 15:45
        You could do this as well:
        // define your middlewares here
       // validateObjectId.js
        const mongoose = require('mongoose');
        module.exports = function (req, res, next) {
            if (!mongoose.Types.ObjectId.isValid(req.params.id))
                return res.status(404).send("Invalid ID.");
            next();
        }
        
    // 404.js 
    module.exports = function (str, id) {
        if (!str || !id) throw new Error('the string name and id must be defined');
        return `The ${str} with the given ID (${id}) was not found`;
    }
// import your middlewares into your product route
       const validateObjectId = require('../middleware/validateObjectId'); // respect your middleware path
       const fourOfour = require('../middleware/404'); // respect your middleware path
            
       router.put('/:id', validateObjectId, async (req, res) => {
            const { error } = validateProduct(req.body);
            const { name, description, category, tags, withdrawn, extraData, } = req.body
            if (error) return res.status(400).send(error.details[0].message);
        
            let product = await Product.findById(req.params.id).exec();
            if (!product) return res.status(404).send(fourOfour("Product", req.params.id));
            product = await Product.findByIdAndUpdate(req.params.id, {
                name: name || product.name,
                description: description || product.description,
                category: category || product.category,
                withdrawn: withdrawn || product.withdrawn,
               extraData: extraData || product.extraData
            }, { new: true });
            product = await product.save();
           if (!product) return res.status(404).send(fourOfour("Product", req.params.id));
            res.send(product);
        });
0
Hakim Asa 3 अक्टूबर 2020, 09:35