Node.js:我如何克隆一个带有Underscore的对象,然后将新的属性分配给克隆?

我正在使用node和express来处理REST API。 我正在使用mongoose.js,我正在创build一个新的用户文件在我的分贝。 没有汗水,效果很好。

当我想添加一个属性到.save()返回的json对象时,问题就出现了。 我想在保存之后添加这个属性,因为这是一个使用REST接口的客户端的标志,但是这不是我想要保存到数据库的东西。

这是我的例子:

var _ = require('underscore'); var user = new User({"username" : "Joe"}); user.save(function(err, newuser){ if (err) return next(err); var nu = _.clone(newuser); nu.newbie = 'true'; res.send(JSON.stringify(nu)); }); 

下面是一个示例响应(这是在nu ):

 { "username": "Joe", "_id": "4f343383a5503c452a000002", } 

正如你所看到的,我试图添加nu.newbie属性,并将其设置为true并且不起作用。 我相信这是某种范围或参考问题。 有任何想法吗?

问题是保存返回的对象不是一个“原始的”JavaScript对象。 它被mongoose包裹,并在那里有其方法。 当你克隆,你也克隆mongoose的东西!

当一个mongoose对象被res.send发送时,它被序列化,并且mongoose只序列化它所知道的对象的成员。 如果你想添加属性,你需要在“原始”JavaScript对象上进行。 像这样:

 var nu = newuser.toJSON(); nu.newbie = 'true'; res.json(nu); 

另外,res.json只是一个很好的速记,将照顾到转换为JSON和设置内容types。

Interesting Posts