无法向json对象添加属性

时间:2015-06-16 23:24:57

标签: node.js express mongoose

我正在尝试在成功更新时向响应添加状态,但我无法将status属性添加到表单的json对象。这是我的代码

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

    if(req.body.id !== 'undefined' && 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"
}

我不确定我错过了什么。

5 个答案:

答案 0 :(得分:9)

尝试.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 :(得分:6)

Mongoose查询结果不可扩展(对象被冻结或密封),因此您无法添加更多属性。为避免这种情况,您需要创建对象的副本并对其进行操作:

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

更新:我的回答很旧并且工作正常,但我会使用ES6语法

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

使用扩展运算符的另一种方法:

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

答案 2 :(得分:0)

尝试将res.send(objForm)更改为res.send(JSON.stringify(objForm))。我怀疑Mongoose模型有一个自定义的toJson函数,所以当你返回它时,它会以某种方式转换响应。

希望以上有所帮助。

答案 3 :(得分:0)

创建一个空对象并向其添加所有属性:

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

答案 4 :(得分:-1)

只需创建一个容器。

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