# 调用服务问题排查指引

# 小程序/公众号调用(callContainer/connectContainer)

# wx.cloud.callContainer is not a function/wx.cloud.connectContainer is not a function/ fail underfined is not an object

错误原因:基础库版本太低

解决方法:升级基础库版本到2.23.0 及以上,并在「小程序管理后台」-「设置」-「功能设置」-「基础库最低版本设置」中,将值设定为2.23.0 及以上。

# errCode: 102002 | errMsg: 请求超时

错误原因:请求超时,导致报错。

有以下几种可能:

  1. 请求本身耗时过长;

  2. 被调用的云托管服务正在冷启动(从自动暂停中恢复),耗时超过所设timeout。

注意,callContainer方法设置的timeout超时参数最大值不得大于15秒,否则无效。

冷启动超时解决方法:

  1. 优化服务启动速度,比如通过减少加载项等代码优化方式,将冷启动速度控制在所设timeout参数范围之内;

  2. 在「服务设置」中,将「实例副本数」的最小值设为1,保持服务常驻,无论服务是否被请求都不会缩容到0,从根本上避免冷启动。(会产生更多资源消耗及费用,请自行权衡);

普通请求(非冷启动)超时解决方法:

  1. 普通请求耗时过长(非冷启动)时,建议采用异步方式,将请求耗时压缩到所设timeout之内;

  2. 适当增大容器规格,有助于提高请求速度;

  3. 请求中如果包含调用微信开放接口(微信支付/消息安全等),改用「开放接口服务」可以改为走内网通信,提高请求速度。

# errCode: 102005 | errMsg: 无效的 HTTP Method

错误原因:未使用GET/POST/PUT/DELETE作为'method'字段的值。

解决方法:检查确认请求中'method'字段的值。

# errCode: 40097 | errMsg: system error

错误原因:参数非法

解决方法:检查确认请求中各字段值是否符合格式要求。

# errCode: -501000 | errMsg: Path access permission error

错误原因:path不存在或解析错误。

解决方法:检查请求中'path'字段是否有格式错误导致解析失败(例如单双引号,多了空格或非法字符等等)

# errCode: -501000 | errMsg: rrMsg: Authorization mismatch uin

错误原因:指定环境不属于调用的小程序/公众号。可能是「资源复用」配置不对,也可能是你调用了不属于你的服务。

解决方法:检查是否忘记配置resourceAppid,直接在callContainer中调用了不是当前小程序/公众号开通的云托管环境中的服务。

# errCode: -606001 | errMsg: 请求包大小超过 100KB

解决方法:压缩请求包大小。请勿在请求体中加入图片/视频/文件。上述类型请先上传到「对象存储」后,仅将fileID通过请求体传给后端的云托管服务。

# errCode: -606002 | errMsg: 响应包大小超过 1MB

解决方法:压缩响应包大小。请勿在响应中加入图片/视频/文件。上述类型请先上传到「对象存储」后仅将fileID通过请求体传回客户端,客户端再通过fileID从「对象存储」下载对应文件。

# errCode: -606003 | errMsg: 账号欠费

错误原因:指定环境已欠费。

解决方法:通过「微信云服务助手」小程序,为对应环境充值,恢复服务。

# errCode: -606006 | errMsg: 不允许未登录模式请求

错误原因:公众号H5调用,是指在公众号登录状态下进行的调用。如果公众号未登录则和普通网页一样,没有微信用户体系,无法使用callcontainer。

解决方法:改在公众号登录状态下调用。

# errCode: -601027 | errMsg: Environment not found

错误原因:环境id错误,指定环境不存在。

解决方法:重新确认填写了正确的环境id。注意不是环境名。

# errCode: -601031 | errMsg: EnvDbId [], ServiceName [] not exist.

错误原因:指定环境中不存在该服务,或该环境不属于当前调用的小程序/公众号。 有以下几种可能:

  1. 服务名填写错误,环境中不存在此服务。

  2. 环境id填写错误,填错的环境中不存在此服务。

  3. 服务已被删除。

  4. 只有一个空服务,服务下没有线上版本。

  5. 指定环境不属于调用的小程序/公众号。可能是「资源复用」配置不对,也可能是你调用了不属于你的服务。 检查是否忘记配置resourceAppid,直接在callContainer中调用了不是当前小程序/公众号开通的云托管环境中的服务。

请注意,并非任何人、任何小程序/公众号只要能拿到环境id和服务名,就能任意调用对应的云托管服务。云托管的安全性保证了只有以下小程序/公众号可以通过callcontainer内网访问对应的服务:

  1. 当前小程序/公众号直接开通的微信云托管环境(登录微信云托管控制台所选小程序/公众号);

  2. 同一主体的其他小程序/公众号开通的微信云托管环境,并在微信云托管控制台为当前小程序/公众号设置了「资源复用」。

# errCode: -601034 | errMsg: 没有权限,请先开通云托管

错误原因:当前小程序/公众号未开通微信云托管,也没有被其他同主体已开通微信云托管的小程序/公众号设置「资源复用」。

请注意,并非任何人、任何小程序/公众号只要能拿到环境id和服务名,就能任意调用对应的云托管服务。云托管的安全性保证了只有以下小程序/公众号可以通过callcontainer内网访问对应的服务:

  1. 当前小程序/公众号直接开通的微信云托管环境(登录微信云托管控制台所选小程序/公众号);

  2. 同一主体的其他小程序/公众号开通的微信云托管环境,并在微信云托管控制台为当前小程序/公众号设置了「资源复用」。

# Invalid AppId in host

错误原因:未正确设置「资源复用」,及resourceAppid。

有以下几种可能:

  1. 配置了resourceAppid,但没有在控制台配置好「资源复用」,当前小程序/公众号无法调用其他小程序/公众号的服务。

  2. resourceAppid与resourceEnv填写错误或不匹配。请注意resourceAppid是开通了对应云托管环境的小程序/公众号的Appid。

# INTERNAL_REQUEST_FAIL/SYS_ERR

系统内部错误,请到微信云托管社区反馈,或者提交工单给我们。

# 同一个服务,公网访问正常但小程序/公众号访问报错。

优先检查代码中处理微信header/openid相关逻辑是否有问题。

# 明明使用了GET/DELETE/PUT,却都被变成了POST。

错误原因:基础库版本过低。

解决方法:升级基础库版本到'2.23.0'以上

# 请求通过callContainer传到后台params出现中文乱码

解决方法:自行做下encodeURIComponent。

# 公网调用

# 公网url访问服务为什么不用加端口号/加了端口号反而报错

一个服务只能设置一个端口,在「服务设置」中定义、部署时决定,这个端口不会暴露给调用方,公网域名(无论自定义域名还是默认域名)收到请求后会由云托管的统一网关(你无须感知和维护)转发到你对应的端口。 即使你在服务设置中变更了端口,你的调用方也不感知也无需做任何改动。

# 一段时间不访问服务后,发现访问不通或访问速度明显变慢。再次访问后恢复/ 控制台服务状态显示:0 个实例(自动暂停)或服务冷启动中//SERVICE_NOT_READY

「服务设置」中,实例副本数最小值为0时,需要注意半小时无请求服务将缩容到0,服务暂停,最大程度节约资源。再次请求时将重启服务,扩容新的实例。 服务从0扩容到1(冷启动)耗时由服务启动速度决定,请尽可能优化服务启动性能。

如果你想彻底避免服务冷启动影响,到「服务设置」中将「实例副本数」最小值设为1,但会持续产生资源消耗,请根据业务状态自行权衡。

# 某个地区的用户无法访问默认公网域名,其他地区不受影响

默认公网域名仅作测试之用,容易受不同地区网络波动/运营商政策影响,不建议用于大规模生产环境。请使用callcontainer方式调用或绑定自定义域名。

# upstream connect error or disconnect/reset before headers. reset reason: connection failure

版本更新是无缝衔接的,但有时候因为自身服务原因,无法及时提供服务,流量切换出现空白,一般持续1分钟自动就好了,前端可以针对此情况做兼容。一般推荐的做法是灰度发布,先50%,然后隔3-5分钟,结束灰度,完成版本更新。

# SERVICE_FORBIDDEN: when your service LoadBalance is detected to be deleted。

底层组件缺失,尝试重新部署。如果仍然无法解决,请提交工单。