最近在react中引入amis进行低代码开发,遇到一个问题,记录下来。
业务背景用户打开页面立即获取一个任务,填写表单并提交,提交完成后获取下一条任务,遇到的bug是表单提交后,无法触发reload
amis schemalet schema = {
type: 'page',
name: 'my_page',
body: {
type: 'service',
name: 'my_service',
api: {
url: '/task/get',
adaptor: (payload: any, response: any) => response,
},
body: [
{
type: 'video',
className: 'videoWrapper',
src: '${sourceVideo}',
},
{
type: 'form',
wrapWithPanel: false,
rules: [
{
rule: 'data.algResultReview != 0',
message: '请判断安全带状态',
name: ['algResultReview'],
},
],
body: [
{
type: 'button-group-select',
name: 'algResultReview',
label: '是否系安全带:',
options: [
{
label: '是',
value: 1,
},
{
label: '否',
value: 2,
},
{
label: '无法判断',
value: 3,
},
],
},
{
type: 'action',
label: '保存并下一个',
level: 'info',
actionType: 'ajax',
api: {
url: '/task/update',
adaptor: (payload: any, response: any) => {
return response;
},
data: {
algResultReview: '${algResultReview}',
id: '${id}',
userName: '${user.userName}',
},
},
reload: 'my_service',
},
],
},
],
},
};
原因排查
我们的业务逻辑是update成功之后data返回一个0,排查代码发现amis内部会对ajax的response.data进行判断,如果data为空,会认为无响应,直接报错。(感觉这个限制不太合理,业务接口返回为空也没什么不妥,凭什么在这里给掐死)
function responseAdaptor(ret, api) {
var data = ret.data;
var hasStatusField = true;
if (!data) {
throw new Error('Response is empty');
}
// 返回内容是 string,说明 content-type 不是 json,这时可能是返回了纯文本或 html
if (typeof data === 'string') {
//....
}
}
解决方案
前端在api.adaptor中判断如果是0,return ‘0’
api: {
url: '/task/update',
adaptor: (payload: any, response: any) => {
if(response === 0) {
return '0'
}
return response;
},
后端改接口
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)