Выполнить функцию для каждого помощника и событий - PullRequest
0 голосов
/ 27 февраля 2020

Я пытаюсь создать автоматизированную c систему сообщений об ошибках для своего метеорного приложения, но есть одна маленькая вещь, которую я сейчас не могу сделать. Я хотел бы знать, возможно ли создать какую-либо оболочку, которая будет выполняться каждый раз при вызове помощника или события для любого шаблона.

Я искал в Blaze. js, чтобы увидеть как они справляются с этим и, возможно, редактируют его, но я думаю, что изменение этого файла не является способом go.

. Я ничего не нашел по этому поводу, и на данный момент, я не уверен, что это даже возможно.

РЕДАКТИРОВАТЬ: Я нашел какое-то решение, но оно далеко от совершенства.

Я создал globalHelper:

Template.registerHelper('checkError', (tmplName, helperName, ...args) => {
    try {
        return Template[tmplName].__helpers.get(helperName).apply(this, args);
    } catch(error) {
        let trace = error.stack.split('\n').map(function (line) { return line.trim(); })
        let obj = {
            text: "" + error,
            date: parseInt(Date.now() / 1000),
            function: trace[0].split('@')[0],
            template: tmpl,
            trace: trace.slice(0, trace.length - 1)
        }
        Meteor.call("logNewCrash", obj, function(err, res) {
            if (!err) {
                Bert.alert("Une erreur est survenue et à été communiquée à un administrateur. Elle sera traitée dans les plus brefs délais.", "danger");
            }
        })
    }
});

Он работает, как и ожидалось, но мне нужно вызвать этого помощника вместо оригинальных, например:

<template name=templateName1>
    {{#if checkError 'templateName1' 'helperName1' arg1 arg2}}
        <!--do something-->
    {{/if}}
</template>

со следующим помощником:

helperName1(arg1, arg2) {
    if (arg1 == arg2)
        return true;
    return false;
}

РЕДАКТИРОВАТЬ 2:

Поэтому я отбросил свой предыдущий работать над созданием пакета метеора.

Я успешно переопределил Blaze._wrapCatchingExceptions примерно так:

Blaze._wrapCatchingExceptions = function (f, where) {
    if (typeof f !== 'function')
        return f;
    return function () {
        try {
            return f.apply(this, arguments);
        } catch (error) {
            let trace = error.stack.split('\n').map(function (line) { return line.trim(); })
            let obj = {
                text: "" + error,
                date: parseInt(Date.now() / 1000),
                function: trace[0].split('@')[0],
                template: Template.instance().view.name.split('.')[0],
                trace: trace.slice(0, trace.length -1)
            }
            Meteor.call(configuration.method, obj, function(err, res) {
                if (!err) {
                    Bert.alert(res.msg, "danger");
                }
            });
            Blaze._reportException(error, 'Exception in ' + where + ':');
        }
    };
};

Однако некоторые ошибки обрабатываются не Blaze, а Tracker. Это - то, где это расстраивает, я не могу заставить работать свое переопределение Tracker.

Я пытался переопределить Tracker._runFlush и _throwOrLog, но либо я получил Maximum stack size exceeded, либо моя функция просто не вызывается

Я, вероятно, делал это неправильно.

Что мне не хватает?

Спасибо

...