Weird bug with Accounts.onCreatedUser

Weird bug with Accounts.onCreatedUser

本文关键字:onCreatedUser Accounts with bug Weird      更新时间:2023-09-26

我遇到了一个奇怪的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()
  }
}