覆盖Meteor中的包方法

时间:2014-08-30 14:39:37

标签: javascript meteor packages

我正在建立一个朋友包,我需要在每个创建的新用户文档上存储一些数据。我查看了文档,发现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, ...,这意味着此代码实际上从未运行过。

我是否在尝试覆盖提供的包行为时出错?

1 个答案:

答案 0 :(得分:0)

Accounts.onCreateUser是您调用绑定自定义函数的方法。 "只打电话一次"意味着您只能绑定一个自定义功能。 如果没有其他任何东西绑定自定义函数,onCreateUser永远不会被调用

例如,如果您只想添加个人资料&朋友根据你的代码,只做:

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