错误报告ExtJS 7.4.0数据读取器

63lcw9qa  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(149)

第一次在这个账号上发帖,多么令人兴奋。遗憾的是,内容没有那么令人兴奋。我在reader.json函数getResponseData中发现了一个非常简单的bug。
我希望在我的应用程序中有正确的错误处理,如果我正在查询的服务器意外地没有提供给我有效的JSON。读取器有一个异常事件,正是这个问题。但是,reader.json将XHR上的responseType设置为"json"
here所示,这将在XHR上的response.response中产生null值:
当将responseType设置为特定值时,作者应该确保服务器实际发送的响应与该格式兼容。如果服务器返回的数据与所设置的responseType不兼容,则response的值将为空。
getResponseData希望避免工作,因此将返回responseJson,如果这是一个对象:

if (typeof response.responseJson === 'object') {
    return response.responseJson;
}

然而,在Chrome版本中,我使用的typeof null计算结果为"object"
我在我的应用程序中修复了这个问题,方法是覆盖函数并将上面的第一行替换为if (Ext.isObject(response.responseJson)) {,但我认为应该在框架代码中修复这个问题。
我不是真的在寻找答案,但一些对 Sencha 的React会很好。
这是张贴在这里,因为我浏览了https://stackoverflow.blog/2019/10/30/why-sencha-is-moving-its-support-forums-to-stack-overflow/
版本信息

  • ExtJS发布版本7.4.0
  • 谷歌浏览器版本92.0.4515.131(64位)

编辑:看来我的文字对我的问题还不够明确,所以我在这里添加一个例子。我有一个商店,看起来像这样:

Ext.define('myCoolStore', {
    extend: 'Ext.data.Store',

    constructor: function(cfg) {
        var me = this;
        cfg = cfg || {};
        me.callParent([Ext.Object.merge({
            proxy: {
                type: 'ajax',
                withCredentials: true,
                reader: {
                    type: 'json',
                    rootProperty: 'results'
                },
                listeners: {
                    exception: {
                        fn: me.onAjaxException,
                        scope: me
                    }
                }
            }
        }, cfg)]);
    },

    onAjaxException: function(proxy, response, operation, eOpts) {
        // ..
    }
});

现在,如果我执行myCoolStore.load(),我期望服务器响应如下:

{
    "success": true,
    "deprecated": false,
    "results": [{
        "id": "11730",
        "bericht_id": "167",
        "projekt_id": "1429",
        "lastedit": "2021-08-10 16:01:20",
        "lastedit_mitarbeiter_id": "182"
    }],
    "errors": [],
    "messages": [],
    "total": 1,
    "metaData": null
}

但是,服务器可能会被窃听并返回其他内容,即无效的JSON。

[..date..] [php7:notice] [pid ..pid..] [client ..ip..] PHP Notice:  Trying to get property 'myCoolProperty' of non-object in file.class.php on line 80, referer: ..myCoolSite..
{
    "success": true,
    "deprecated": false,
    "results": [{
        "id": "11730",
        "bericht_id": "167",
        "projekt_id": "1429",
        "lastedit": "2021-08-10 16:01:20",
        "lastedit_mitarbeiter_id": "182"
    }],
    "errors": [],
    "messages": [],
    "total": 1,
    "metaData": null
}

reader.json的默认行为不会在这里设置异常,因为XHR将无法解析它,导致reponseJson成为null,这将通过typeof-check。

bwleehnv

bwleehnv1#

根据RFC7159规范,null是一个有效的JSON值:
JSON值必须是对象、数组、数字或字符串,或者是以下三个文字名称之一:
假空真
所以我认为这是预期的行为,而不是一个bug。如果你想自定义如何处理响应,你可以尝试以下两种方法之一。

1.定义全局请求异常处理程序

在您的Application.js中执行如下操作:

Ext.define('MyApp.Application', {
    extend: 'Ext.app.Application',
    name: 'MyApp',
    launch: function () {
        const me = this;
        Ext.Ajax.on('requestexception', me.onRequestException);
    },
    onRequestException: function (conn, response, options, eOpts) {
        // this will run on every error during request (timeout, abort, 4xx, 5xx etc.)
        // for example Ext.isEmpty(response.responseJson) will result true on null value
        // add a breakpoint here and look what is in the variables in your case
    }
});

2.创建自定义读取器以截获响应的转换方式

这样定义读者:

Ext.define('MyApp.data.reader.RestJson', {
    extend: 'Ext.data.reader.Json',
    alias: 'reader.myreader',
    getResponseData: function (response) {
        // evalutate here with debugger what you have in
        // response and do the conversion you'd like
        return something;
    }
});

并在需要时使用此阅读器:

Ext.create('Ext.data.Store', {
    model: 'MyModel',
    proxy: {
        type: 'rest',
        url : 'myurl',
        reader: {
            type: 'myreader'
        }
    }
});

相关问题