невозможно добавить свойство к объекту json

#javascript #node.js #mongodb #for-loop

#node.js #выразить #мангуст

Вопрос:

Я пытаюсь добавить статус к ответу на успешное обновление, но я не могу добавить свойство status к объекту формы json. Вот мой код

 apiRouter.post('/forms/update', function(req, res){

    if(req.body.id !== 'undefined' amp;amp; req.body.id){

        var condition = {'_id':req.body.id};

        Form.findOneAndUpdate(condition, req.body, {upsert:true}, function(err, form){

            if (err) return res.send(500, { error: err });

            var objForm = form;

            objForm.status = "saved successfully";

            return res.send(objForm);

        });

    }else{
        res.send("Requires form id");
    }

});
 

и вот ответ, который я получаю, статус уведомления отсутствует

 {
    "_id": "5580ab2045d6866f0e95da5f",
    "test": "myname",
    "data": "{"name":3321112,"sdfsd"344}",
    "__v": 0,
    "id": "5580ab2045d6866f0e95da5f"
}
 

Я не уверен, чего мне не хватает.

Ответ №1:

Попробуйте .toObject() форму:

 Form.findOneAndUpdate(condition, req.body, {upsert:true}, function(err, form){

    if (err) return res.send(500, { error: err });

    var objForm = form.toObject();

    objForm.status = "saved successfully";

    return res.send(objForm);

});
 

Комментарии:

1. Важно понимать (как в ответе @Jose Mato), что результаты запроса mongoose не являются расширяемыми!

Ответ №2:

Результаты запроса Mongoose не являются расширяемыми (объект заморожен или запечатан), поэтому вы не можете добавить дополнительные свойства. Чтобы избежать этого, вам нужно создать копию объекта и управлять им:

 var objectForm = Object.create(form);
objectForm.status = 'ok';
 

Обновление: мой ответ устарел и работал нормально, но я добавлю то же самое, используя синтаксис ES6

const objectForm = Object.create({}, form, { status: 'ok' });

Другой способ с использованием оператора распространения:

const objectForm = { ...form, status: 'ok' }

Комментарии:

1. в ES6 есть другая возможность: const objectForm = Object.assign(форма, { статус: ‘ok’ });

Ответ №3:

Попробуйте изменить res.send(objForm) на res.send(JSON.stringify(objForm)) . Я подозреваю, что модель Мангуста имеет пользовательскую функцию toJSON, так что, когда вы возвращаете ее, она каким-то образом преобразует ответ.

Надеюсь, вышесказанное поможет.

Комментарии:

1. нет, я тоже это пробовал. Он просто изменяет объект на строку и не добавляет свойство : (

2. Тогда ленивым взломом было бы go var objForm = JSON.parse(JSON.stringify(form)); или Object.create, как указано выше. Так что вы работаете над копией.

Ответ №4:

Создайте пустой объект и добавьте к нему все свойства:

 const data = {};
data._id = yourObject._id; // etc
data.status = "whatever";
return res.send(data);
 

Ответ №5:

Просто создайте контейнер.

 array = {};
Model.findOneAndUpdate(condition, function(err, docs){
    array = docs;
    array[0].someField ="Other";
});