从 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 时使用它,因此可以安全使用。
我想从商店代理调用中获取错误消息。
我的店铺是这样的:
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 时使用它,因此可以安全使用。