Node.js 为每个助手和事件执行函数
我正在尝试为我的meteor应用程序建立一个自动错误报告系统,但有一件事我现在还不能做。我想知道是否有可能为任何模板创建某种包装器,在每次调用助手或事件时执行 我在blaze.js中搜索了一下,看看他们是如何处理它的,可能还会对它进行编辑,但我想修改这个文件不是一个好办法 我什么也没发现,在这一点上,我甚至不确定这是否可能 编辑:我找到了某种解决方案,但还远远不够完美 我已经创建了一个globalHelper:Node.js 为每个助手和事件执行函数,node.js,meteor,meteor-blaze,Node.js,Meteor,Meteor Blaze,我正在尝试为我的meteor应用程序建立一个自动错误报告系统,但有一件事我现在还不能做。我想知道是否有可能为任何模板创建某种包装器,在每次调用助手或事件时执行 我在blaze.js中搜索了一下,看看他们是如何处理它的,可能还会对它进行编辑,但我想修改这个文件不是一个好办法 我什么也没发现,在这一点上,我甚至不确定这是否可能 编辑:我找到了某种解决方案,但还远远不够完美 我已经创建了一个globalHelper: Template.registerHelper('checkError', (tmp
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>
编辑2:
所以我放弃了以前的工作,创建了一个meteor软件包
我成功地覆盖了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处理的。这就是令人沮丧的地方,我无法让我的跟踪器覆盖工作
我试图覆盖跟踪器。_runFlush
和\u throwOrLog
但是要么我得到了最大堆栈大小超过了
,要么我的函数根本没有被调用
我可能做错了
我错过了什么
谢谢
我在blaze.js中搜索了一下,看看他们是如何处理它的,可能还会对它进行编辑,但我想修改这个文件不是一个好办法。
你能告诉我你在哪里搜索的,以及那些让你觉得无法修改的代码吗?我这样问是因为我已经覆盖了我的一个包的模板生命周期方法,所以我知道这是可能的。我一开始真的不知道在哪里搜索,这就是为什么我认为这可能不是我应该做的,但文件位于.meteor/local/build/programs/server/packages/blaze.js
中,代码如下:这是本地构建文件夹,每次更改文件时都会更改,因此没有必要覆盖那里的内容。你可以在我的包中看看我是如何重写onCreated函数的:是的,我就是这么想的,我要看看你的包,谢谢:)好吧,在看了你的包之后,我真的不知道我该如何适应我的情况。我不理解如何将我的try-catch附加到我的helpers/events/onCreated/onRendered
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 + ':');
}
};
};