Я пытаюсь создать автоматизированную 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
, либо моя функция просто не вызывается
Я, вероятно, делал это неправильно.
Что мне не хватает?
Спасибо