Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 为每个助手和事件执行函数_Node.js_Meteor_Meteor Blaze - Fatal编程技术网

Node.js 为每个助手和事件执行函数

Node.js 为每个助手和事件执行函数,node.js,meteor,meteor-blaze,Node.js,Meteor,Meteor Blaze,我正在尝试为我的meteor应用程序建立一个自动错误报告系统,但有一件事我现在还不能做。我想知道是否有可能为任何模板创建某种包装器,在每次调用助手或事件时执行 我在blaze.js中搜索了一下,看看他们是如何处理它的,可能还会对它进行编辑,但我想修改这个文件不是一个好办法 我什么也没发现,在这一点上,我甚至不确定这是否可能 编辑:我找到了某种解决方案,但还远远不够完美 我已经创建了一个globalHelper: Template.registerHelper('checkError', (tmp

我正在尝试为我的meteor应用程序建立一个自动错误报告系统,但有一件事我现在还不能做。我想知道是否有可能为任何模板创建某种包装器,在每次调用助手或事件时执行

我在blaze.js中搜索了一下,看看他们是如何处理它的,可能还会对它进行编辑,但我想修改这个文件不是一个好办法

我什么也没发现,在这一点上,我甚至不确定这是否可能

编辑:我找到了某种解决方案,但还远远不够完美

我已经创建了一个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>
编辑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 + ':');
        }
    };
};