从 Store Proxy 获取错误消息

Getting error message from Store Proxy

我想从商店代理调用中获取错误消息。

我的店铺是这样的:

Ext.define("MyStore", {
    extend: "Ext.data.Store",
    model: 'mymodel',
    proxy: {
        type: 'customrest',
        paramsAsJson: true,
        url: myUrl,
        actionMethods: {
            read: 'POST'
        },
        reader: {
            type: 'json',
            record: 'result',
            root: 'results'
        }
    },

    listeners: {
        load: function (store, records, success) {
            if (!success) {

            }else {
                //OK
        }
        }
    }
});

好像只给我success is false,手边没有其他信息。我知道还有一条错误消息返回,因为返回的数据如下所示:

{success: false, message: "blah blah blah“"}

有什么地方可以让我了解 'message' 吗?

更新:

我的店是这样叫的:

this.psstore = Ext.getStore("MyStore"); 

this.psstore.load({
    params: postBody,
    callback: function (records, operation, success) {

        if (success) {

是的,有,但不,你不应该使用它。

在您的情况下,在 ExtJS 6 之前的 ExtJS 中,您可以轻松地从 getStore().getProxy().getReader().rawData 读取整个原始响应,除非您在 reader 定义中设置了 keepRawData:false。这带有一个很大的 but.

在 6.0 中,如果您不在 reader 上使用 keepRawData,那么原始响应数据会很早就被丢弃。原因,引用文档:请注意,从 Ext JS 6.0 开始,默认行为已更改为不保留原始数据,因为内存泄漏的可能性很高。

因此,我在 reader 上为 ExtJS 6.0.1 添加了一个覆盖:

Ext.define("MyApp.override.JsonReader", {
    override:"Ext.data.reader.Json",
    /**
     * Make additional processing available on the raw response.
     */
    processRawResponse:null,
    getResponseData:function(response) {
        if(this.processRawResponse) this.processRawResponse(response);
        me.callParent(arguments);
    }
});

所以现在我可以根据需要在每个 reader 上添加一个 processRawResponse 函数,就像这个:

proxy: {
    type: 'ajax',
    groupParam: false,
    startParam:false,
    limitParam:false,
    pageParam:false,
    sortParam:false,
    url: '../api/AdminPanel/ACLRules',
    headers: {
        Accept: 'application/json'
    },
    reader: {
        type: 'json',
        rootProperty: 'data',
        processRawResponse:function(response) {
            var responseText = Ext.decode(response.responseText, true);
            if(responseText && responseText.message) {
                Ext.Msg.alert('ERROR',responseText.message);
            }

你可以试试这在 ExtJS 4 中是否也有效; from the source code, it seems so。否则,只需进行微小的更改。

如果您的错误消息每次都相同 属性 并且每次都需要相同的处理,您也可以直接从覆盖中全局处理它们,例如如果你得到一组调试信息:

getResponseData:function(response) {
    if(this.processRawResponse) this.processRawResponse(response);
    var debugList = Ext.getCmp("debugList"),
        shorten = function(tex) {
            return tex.substring(0,500).replace(/(\r\n|\r|\n)/g,"<br>");
        },
        returned = "";
    try {
        returned = response.responseText;
        var decodedData = Ext.decode(returned);
        if(decodedData.Debug) this.rawDebugData = decodedData.Debug;
        return decodedData;
    } catch (ex) {
        var caption = "Decoding error",
            message = "The server has returned malformed JSON.",
            box = Ext.create('Ext.window.MessageBox',{});
        try {
            var jsonStart = Math.min(returned.indexOf('['), returned.indexOf('{'));
            if(jsonStart>0) {
                message = (message + "\n" + returned.substring(0,jsonStart));
                returned = returned.substring(jsonStart);
            }
            else {
                message = (message + "\n" + returned);
            }
        } catch (e) {
        }
        if(!debugList) box.alert(caption,shorten(message));
        if(debugList) debugList.setValue(debugList.getValue()+caption+': '+message+'\n');
        return Ext.decode(returned, true) || {};
    }
},

检查你的 reader 的 messageProperty:

http://docs.sencha.com/extjs/4.0.7/#!/api/Ext.data.reader.Json-cfg-messageProperty

所以在你的配置中你应该有:

    reader: {
        type: 'json',
        record: 'result',
        root: 'results',
        messageProperty: 'message'
    }

然后您应该能够通过加载回调中的 operation.exception 属性 (IIRC) 获取消息。它也是在 onLoad 事件 (http://docs.sencha.com/extjs/4.0.7/#!/api/Ext.data.Store-event-load) 中传递的参数,因此您也应该能够在那里访问它。我们在带有 XML reader 的 Ext 4 上使用它,并在升级到 6 时使用它,因此可以安全使用。