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