# 调用服务问题排查指引

## 小程序/公众号调用（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

系统内部错误，请到[微信云托管社区反馈](https://developers.weixin.qq.com/community/minihome/mixflow/1919566493118201863)，或者提交工单给我们。

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

优先检查代码中处理微信 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。

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