Javascript 防止在模型中包含意外数据的Backbone.js应用程序中发生崩溃

Javascript 防止在模型中包含意外数据的Backbone.js应用程序中发生崩溃,javascript,jquery,json,node.js,backbone.js,Javascript,Jquery,Json,Node.js,Backbone.js,我构建了一个巨大的backbone.js应用程序,其工作方式如下: 如您所见,有一个Databackbone.js模型,它的值由getters.js中的getters访问,这些值在下划线模板中用于定义一些内联样式。页面中的内容存在于另一个主干模型中,称为contents 页面基本上由三个元素组成:菜单、内容和底部栏。这些元素中的每一个都有自己的模板,但它们都包含在同一模板中。这意味着View.js在其render()函数中通过运行主模板来填充页面主体,主模板显示菜单,包括内容和底部栏模板 在我

我构建了一个巨大的backbone.js应用程序,其工作方式如下:

如您所见,有一个Databackbone.js模型,它的值由getters.js中的getters访问,这些值在下划线模板中用于定义一些内联样式。页面中的内容存在于另一个主干模型中,称为contents

页面基本上由三个元素组成:菜单、内容和底部栏。这些元素中的每一个都有自己的模板,但它们都包含在同一模板中。这意味着View.js在其render()函数中通过运行主模板来填充页面主体,主模板显示菜单,包括内容和底部栏模板

在我将其部署到生产中之前,它工作得非常好;数据主干模型是从另一个应用程序的JSON文件构建的,我不知道的是,这个JSON有时可能与我对getter的预期不同。这意味着可能缺少一些值,一些作为字符串的值可能是包含该字符串的对象,等等

这是一个巨大的问题,因为getter经常产生“无法读取未定义的值颜色”。如果他们所做的只是从主干模型返回值,那就可以了,因为他们只返回未定义的值或其他超出预期的值。但是,由于它们也执行一些逻辑(如我的示例中的getBottomBarColor所示),因此它们会得到未定义或意外的类型化值,并尝试使用它,这使它们崩溃

模板是嵌套的,由browserify.js预编译为js函数。这意味着如果一个getter在某个点崩溃,整个函数(即整个模板)就会崩溃,导致一个空白页面

代码已经投入生产,现在改变整个应用程序的构建方式为时已晚。我一直在想一些方法来处理格式错误的数据问题我的getters.Js文件有3000行大,因此要手动编辑以将try-catch放在其中的任何地方都太长了,所以我考虑在getters.Js的末尾放一些类似的内容:

_.each(getters, function(getterFunction, getterName){
    getters[getterName] = function(){
        try{
            return getterFunction.apply(this, arguments);
        } catch(e){
            sendErrorToDevByAjax(e, getterName);
            return "";  
        }
    }
});
这将避免getter中的崩溃,但这会很慢(try-catch),而且这不是不可中断的,因为在崩溃时我返回一个空字符串,如果模板在那里需要字符串,这是可以的,但是如果模板需要bool或对象,它无论如何都会崩溃(因此,我也必须在模板调用中加入try-catch,在我看来,这样做太慢了)


如果有人知道我可以做些什么来防止崩溃,或者我计划做得更好,我会很乐意接受。

期望对象的函数在访问它之前检查所需属性是否存在吗?对于函数参数,可以执行
getterFunction.apply(null,参数)
没有声明每一个对象。很好,我正在研究如何使用参数obj,但没有考虑将apply与之一起使用。不,期望对象并尝试访问其属性的函数不会每次都检查对象是否已定义。我不知道如何返回它们以避免崩溃。另外,我想知道try的影响是否例如,在移动设备上捕获不会太多,在服务器上实现一个代理如何,它从第三方获取json,并以预期的格式模拟任何丢失的数据?我用你的应用程序编辑了它-我甚至可以在客户端格式化json,然后再使用它做任何其他事情,但是这个json非常大,有很多数据不同的配置,为它编写一个格式化类需要很长时间,正如我所说的,这段代码已经被应用程序使用了,所以我正在寻找快速解决方案