2014-08-30 103 views
0

我正在構建一個朋友包,並且需要在創建的每個新用戶文檔上存儲一些數據。我查看了文檔,並找到了Accounts.onCreateUser。文檔明確指出它只能被調用一次,其他調用將覆蓋先前指定的行爲。覆蓋流星中的包裝方法

因此,我所做的是:

  • 存儲舊功能
  • 覆蓋實際onCreateUser功能有一個,增加了所需要的數據
  • 這種新的功能,然後調用加入我的數據後,舊的

if (Meteor.isServer) { 
    var _onCreateUser = Accounts.onCreateUser.bind(Accounts); 
    // Since onCreateUser overrides default behavior, and we don't want to restrict package users 
    // by removing the onCreateUser function, we override onCreateUser to modify the user document before the regular onCreateUser call. 
    Accounts.onCreateUser = function (func) { 
     console.log('onCreateUser definition'); 
     _onCreateUser(function (options, user) { 
      console.log('onCreateUser call, the user should now have a profile'); 
      if (!user.profile) { 
       user.profile = options.profile || {}; 
      } 
      if (!user.profile.friends) { 
       user.profile.friends = []; 
      } 
      return func(options, user); 
     }); 
    }; 
} 

的問題是,如果我看在我的服務器日誌,我從來沒有看到任何日誌onCreateUser definitiononCreateUser call, ...含義此代碼永遠不會實際運行。

我做錯了嘗試覆蓋提供的軟件包行爲?

回答

0

Accounts.onCreateUser是你所說的綁定你的自定義函數。 「僅調用一次」意味着您只能綁定一個自定義函數。 如果沒有別的結合自定義函數,onCreateUser將永遠不會被稱爲

Eg.if你只是想添加會員&朋友按照你的代碼,只是做:基於

Accounts.onCreateUser(function (options, user) { 
     console.log('onCreateUser call, the user should now have a profile'); 
     if (!user.profile) { 
      user.profile = options.profile || {}; 
     } 
     if (!user.profile.friends) { 
      user.profile.friends = []; 
     } 
     return user; 
}); 

您的評論,我會建議創建一個問題/向Meteor提交拉取請求,以允許Accounts.onCreateUser將每個函數附加到一個鉤子數組。

你需要修改的代碼在Accounts.insertUserDoc

+0

的問題是,這onCreateUser通話是在一個包。當我像你的例子那樣做的時候,當他們將應用程序代碼中的函數綁定到onCreateUser時,那些使用我的包的人會覆蓋我的包的自定義onCreateUser行爲,對嗎? – Azeirah 2014-08-31 15:57:27

+0

是的,但是,如果他們沒有調用'Accounts.onCreateUser',你的代碼將永遠不會運行。 – 2014-08-31 22:36:21