Node.js:如何使用Underscore克隆对象并在之后为克隆分配新属性?

时间:2012-02-09 21:03:49

标签: node.js clone express mongoose underscore.js

我正在使用带有node和express的REST API。我正在使用mongoose.js,我正在我的数据库中创建一个新的用户文档。没有汗水,效果很好。

当我想要向.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,但它无效。我相信这是某种范围或参考问题。有什么想法吗?

1 个答案:

答案 0 :(得分:5)

问题是save返回的对象不是“原始”javascript对象。它由猫鼬包裹,并在那里有它的方法。当你克隆时,你也克隆了猫鼬的东西!

当一个mongoose对象被res.send发送下来时,它被序列化,而mongoose只序列化它所知道的对象的成员。如果要添加属性,则需要在“原始”javascript对象上执行此操作。像这样:

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

另外,res.json只是一个很好的速记,它将负责转换为json并设置内容类型。