Weird bug with Accounts.onCreatedUser
Weird bug with Accounts.onCreatedUser
我遇到了一个奇怪的bug。首先是我的代码
User = {};
User._defaults = {
emails : [],
enabled : true
}
User.defaults = function(){
var defaults = _.clone(User._defaults);
return _.extend(defaults,{
createdAt : new Date()
});
}
Accounts.onCreateUser(function(options, user){
console.log(User.defaults());
// returns {emails: [ { address: 'francis@domain.com', verified: true } ], enabled: true}
_.defaults(user, User.defaults());
user.emails.push(user.services.linkedin.emailAddress);
return user;
});
正如你所看到的,当我调用User.defaults()
时,它返回一个对象,其中emails
数组充满了前一个新用户的电子邮件地址。
但是更奇怪的是,当我这样做的时候:
Accounts.onCreateUser(function(options, user){
console.log(User._defaults, User.defaults());
user.enabled = true;
user.emails = [];
user.createdAt = new Date();
// _.defaults(user, User.defaults());
user.emails.push(user.services.linkedin.emailAddress);
return user;
})
记录的User.defaults()
实际上返回一个emails
数组为空的对象。
有谁知道是什么原因导致的吗??
谢谢! !
这将与下划线clone
函数有关。如果你看过文档
创建所提供的普通对象的浅拷贝克隆。任何嵌套的对象或数组将通过引用进行复制,而不是复制。
最重要的部分是浅拷贝。你的数组不是一个实际的拷贝,它只是一个引用。所以每次都是指向同一个数组
我会这样做。
User = {};
User.defaults = function(){
return {
emails : [],
enabled : true,
createdAt : new Date()
}
}