【问题标题】:unable to add property to the json object无法将属性添加到 json 对象
【发布时间】:2015-09-01 23:58:08
【问题描述】:

我正在尝试将状态添加到成功更新的响应中,但我无法将状态属性添加到表单的 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"
}

我不确定我错过了什么。

【问题讨论】:

    标签: node.js express mongoose


    【解决方案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);
    
    });
    

    【讨论】:

    • 了解(如@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' }

    【讨论】:

    • 在 ES6 中另一种可能性是: const objectForm = Object.assign(form, { status: 'ok' });
    【解决方案3】:

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

    希望以上内容有所帮助。

    【讨论】:

    • 不,我也试过了。它只是将对象更改为字符串而不添加属性:(
    • 那么懒惰的黑客就是去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";
      });
      

      【讨论】:

        猜你喜欢
        • 2015-09-21
        • 2018-07-27
        • 2021-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-05
        • 2013-09-04
        • 2015-11-15
        相关资源
        最近更新 更多