我正在使用带有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
,但它无效。我相信这是某种范围或参考问题。有什么想法吗?
答案 0 :(得分:5)
问题是save返回的对象不是“原始”javascript对象。它由猫鼬包裹,并在那里有它的方法。当你克隆时,你也克隆了猫鼬的东西!
当一个mongoose对象被res.send发送下来时,它被序列化,而mongoose只序列化它所知道的对象的成员。如果要添加属性,则需要在“原始”javascript对象上执行此操作。像这样:
var nu = newuser.toJSON();
nu.newbie = 'true';
res.json(nu);
另外,res.json只是一个很好的速记,它将负责转换为json并设置内容类型。