创建空的beforesave报terminated

创建了beforesave云函数(在线编辑),把本地调试好的代码放上去,发现报下列错误。我以为是我的代码有问题,于是把自己的代码清空,只留了内容为空的beforesave函数,发现还是报同样的错误!

  1. 我的网络没问题;
  2. 在创建Beforesave函数前,save操作完全没问题,更没ACL问题;
  3. 页面也没被卸载;

错误信息和截图:
Error: Request has been terminated
Possible causes: the network is offline, Origin is not allowed by Access-Control-Allow-Origin, the page is being unloaded, etc.

应该和 beforeSave 关系不大,因为 beforeSave 并不是直接在客户端被调用的。

建议打开 Network 选项卡,看下有没有失败的请求,贴一下完整的请求和响应头。

有响应头么?还是说请求还未完成

没有响应头,直接报Error: Request has been terminated 了

现象上看,这个请求没有任何响应,多半是网络问题。

请问访问一下 https://ping.leanapp.cn 保存一下结果。

确认一下,其他的 Class 是没有问题的是吗?Query 这个 Class 能正常的到结果吗?

没问题。我删除beforeSave云函数后,class一切正常query、save、delete、update都没问题。添加beforeSave云函数后,不管函数里面写不写代码,都无法save,直接报Error: Request has been terminated
Possible causes: the network is offline, Origin is not allowed by Access-Control-Allow-Origin, the page is being unloaded, etc.

麻烦右键这个有问题的请求,copy as cURL

curl 'https://api.leancloud.cn/1.1/classes/Item?' -H 'x-lc-ua: LeanCloud-JS-SDK/2.1.1 (Weapp)' -H 'Origin: http://1434562702.appservice.open.weixin.qq.com' -H 'x-lc-session: lpn73nkvu3bcwizr2oq85dwcj' -H 'User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36 appservice webview/100000' -H 'content-type: application/json;charset=UTF-8' -H 'Referer: http://1434562702.appservice.open.weixin.qq.com/appservice?load' -H 'x-lc-key: s1X6enwNQGT0oeniYnTbNwYh' -H 'x-lc-id: fiy5XbJwsb55ji5fmYh6H5ry-gzGzoHsz' --data-binary $'{"discountRate":-90.91,"itemDeadline":{"__type":"Date","iso":"2017-06-01T15:59:59.000Z"},"descriptValue":"","submitor":{"__type":"Pointer","className":"_User","objectId":"592ec0b22f301e006c7f148b"},"shopName":"\u6d77\u73e0\u6e7f\u5730\u516c\u56ed","productName":null,"locationName":"\u6d77\u73e0\u6e7f\u5730\u516c\u56ed","locationAddress":"\u5e7f\u4e1c\u7701\u5e7f\u5dde\u5e02\u6d77\u73e0\u533a\u65b0\u6ed8\u4e2d\u8def\u9f99\u6f6d\u7ad9(\u8fd1\u5927\u5858\u5730\u94c1\u7ad9B\u51fa\u53e32000\u7c73)","onsalePrice":"7","originPrice":"77","submitorResume":{"nickName":"\u5c0f\u5f3a","avatarUrl":"http://wx.qlogo.cn/mmopen/vi_32/DYAIOgq83epk9hXSeXTRovm89jLAINnu54tfgBvWzpwkK58rqm3n4JicyriaZcYoia6HS8DvCsRvUYGDjlodgyEibw/0","id":"592ec0b22f301e006c7f148b"},"shopLocation":{"__type":"GeoPoint","latitude":23.07763,"longitude":113.33889},"imgSrc":[],"thumbnailImgSrc":[]}' --compressed

这个请求现在能正常创建 Item,请问在小程序中还是有问题吗?还是现在去掉了 hook?

如果还是有问题的话,请问小程序 IDE 有没有设置代理。

是我去掉了hook....也是奇怪,我一移除了这个hook,部署完后,移除前发送的请求就创建成功了,而且同一个请求好像还创建了2条

我这里看到这个 hook 「正确」的超时了:

curl 'https://api.leancloud.cn/1.1/classes/Item?' -H 'x-lc-ua: LeanCloud-JS-SDK/2.1.1 (Weapp)' -H 'Origin: http://1434562702.appservice.open.weixin.qq.com' -H 'x-lc-session: lpn73nkvu3bcwizr2oq85dwcj' -H 'User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36 appservice webview/100000' -H 'content-type: application/json;charset=UTF-8' -H 'Referer: http://1434562702.appservice.open.weixin.qq.com/appservice?load' -H 'x-lc-key: s1X6enwNQGT0oeniYnTbNwYh' -H 'x-lc-id: fiy5XbJwsb55ji5fmYh6H5ry-gzGzoHsz' --data-binary $'{"discountRate":-90.91,"itemDeadline":{"__type":"Date","iso":"2017-06-01T15:59:59.000Z"},"descriptValue":"","submitor":{"__type":"Pointer","className":"_User","objectId":"592ec0b22f301e006c7f148b"},"shopName":"\u6d77\u73e0\u6e7f\u5730\u516c\u56ed","productName":null,"locationName":"\u6d77\u73e0\u6e7f\u5730\u516c\u56ed","locationAddress":"\u5e7f\u4e1c\u7701\u5e7f\u5dde\u5e02\u6d77\u73e0\u533a\u65b0\u6ed8\u4e2d\u8def\u9f99\u6f6d\u7ad9(\u8fd1\u5927\u5858\u5730\u94c1\u7ad9B\u51fa\u53e32000\u7c73)","onsalePrice":"7","originPrice":"77","submitorResume":{"nickName":"\u5c0f\u5f3a","avatarUrl":"http://wx.qlogo.cn/mmopen/vi_32/DYAIOgq83epk9hXSeXTRovm89jLAINnu54tfgBvWzpwkK58rqm3n4JicyriaZcYoia6HS8DvCsRvUYGDjlodgyEibw/0","id":"592ec0b22f301e006c7f148b"},"shopLocation":{"__type":"GeoPoint","latitude":23.07763,"longitude":113.33889},"imgSrc":[],"thumbnailImgSrc":[]}' --compressed -i

HTTP/1.1 400 Bad Request
Server: Tengine
Date: Thu, 01 Jun 2017 06:53:52 GMT
Content-Type: application/json;charset=utf-8
Content-Length: 85
Connection: keep-alive
Cache-Control: no-cache,no-store
Pragma: no-cache
Access-Control-Allow-Origin: http://1434562702.appservice.open.weixin.qq.com

{"code":141,"error":"LeanEngine request timeout. class='Item', action='beforeSave'."}

那调试台接收到的Error: Request has been terminated 是什么原因?我这边没有报超时

理论上,在小程序 IDE 中,这个请求也是应该超时的(并返回 400),但是现在的现象是这个请求一直没有返回任何结果。因此 SDK 不知道发生了什么,所以抛出了一个异常解释了常见的原因。

至于为什么没有得到任何结果,问题可能出在小程序的 IDE 或者基础库上,可能的话,需要在操作系统层面抓这个请求看到底有没有返回。

另一个验证的方法是,部署到真机上看是不是会有同样的问题。

这个我需要写个 Demo 调查一下。目前还请先保证 beforeSave hook 正常返回数据。

本地调试、在线编写云函数都试过了:
只要在AV.Cloud.beforeSave('Review', function(request)的request后面加上response,请求就一定会失败,本地调试会报503错误。把response去掉后,函数体就可以运行了。但这样的话,又好像没有办法阻止save动作的发生,就算我用了throw new AV.Cloud.Error,或response.error,都没法阻止程序往下跑,又不能用return false,所以就算设计了阻止save的逻辑,也没法实现。

在 Node SDK 2.0 中,支持了 Promise 的写法,不需要接收 response 了,但也兼容旧的写法(所以就看你接收不接收 response,接收就按旧版本走,不接收就按新版本走)。

因此你加了 response 而不写 reponse.success,最后超时 503 是正常现象。

在不加 response 的情况下,你 throw new AV.Cloud.Error 应该是会中断 Hook 执行,我刚刚也测试了一下,没有问题。

1)能不能把你的测试代码给我看一下,我用了 throw new AV.Cloud.Error,确实会中断hook的执行,但并没有阻止save事件的执行,还是创建成功了(文档中说用了这个throw就不保存数据,并返回错误)。

下面是hook函数的文档中的示例代码,是我理解错了,还是代码错了?

AV.Cloud.beforeSave('Review', function(request) {
  var comment = request.object.get('comment');
  if (comment) {
    if (comment.length > 140) {
      // 截断并添加...
      request.object.set('comment', comment.substring(0, 137) + '...');
    }
  } else {
    // 不保存数据,并返回错误
    throw new AV.Cloud.Error('No comment!');
  }
});

2)还有,我发现beforeSave这个函数好像是在save操作发生之后执行的,我在beforeSave函数里查询创建者已经创建的数据里,貌似是包含当前这个save请求的数据的,是不是因为这个原因没有阻止save动作的执行?

3) 还有,客户端并没有收到throw过来的错误信息....

@leeyeh @jysperm

代码:

AV.Cloud.beforeSave('Post', (request) => {
  throw new AV.Cloud.Error('some error');
});

然后去控制台上改这个表的数据,会返回错误。

beforeSave 肯定是在保存执行被执行的。