【问题标题】:Node.js: How can I clone an object with Underscore and assign new properties to the clone afterwards?Node.js:如何使用下划线克隆一个对象,然后为克隆分配新属性?
【发布时间】:2012-02-10 06:58:16
【问题描述】:

我正在使用 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,但它不起作用。我相信这是某种范围或参考问题。有什么想法吗?

【问题讨论】:

  • 你能举一个反应不好的例子吗?不工作是指完全缺少属性“新手”还是仅缺少值? 'newuser' 的其余部分是否做出回应?
  • 看不出它不应该工作的任何原因(尽管你不需要引用true,除非你真的打算将它编码为字符串“true”)
  • @XHR 将示例响应添加到原始帖子中。新手完全失踪了。
  • @Flambino 对,true 不需要引号,这对这个测试并不重要。
  • 代码看起来不错,我可以让它在我的环境中工作。您确定混乱不在其他地方吗?请注意,您也可以使用 _.defaults 在一行中执行此操作。 documentcloud.github.com/underscore/#defaults

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


【解决方案1】:

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

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

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

此外,res.json 只是一个很好的简写,它可以处理转换为 json 并设置内容类型。

【讨论】:

    猜你喜欢
    • 2014-01-26
    • 1970-01-01
    • 2016-08-05
    • 2015-02-08
    • 2022-01-20
    • 2011-06-30
    • 1970-01-01
    • 2013-05-29
    相关资源
    最近更新 更多