Status
gRPCity
库提供了非常便捷获取status
的能力。一般情况下会很少使用到,这里就简单提及。
获取 Status
内置 Status
获取:
import { Status } from 'grpcity'
console.log(Status.OK)
客户端获取服务端的 Status
:
客户端获取服务端返回的status
的方式,非常简单,如下所示。
const client = clients.get('path.to.service')
const { status } = await client.rpcMethod()
console.log(status)
// 执行后的打印结果
{
code: 0,
details: 'OK',
metadata: Metadata { internalRepr: Map(0) {}, options: {} }
}
Status Code
默认的 Status Code 详细情况如下表所示:
Code | Number | Description |
---|---|---|
OK | 0 | 非错误;表示成功返回。 |
CANCELLED | 1 | 操作被取消,通常是由调用方取消的。 |
UNKNOWN | 2 | 未知错误。例如,当从另一个地址空间接收到的“Status”值属于此地址空间中未知的错误空间时,可能会返回此错误。还可能将未返回足够错误信息的 API 引发的错误转换为此错误。 |
INVALID_ARGUMENT | 3 | 客户端指定了无效的参数。请注意,这与“FAILED_PRECONDITION”不同。“INVALID_ARGUMENT”表示无论系统状态如何,参数都存在问题(例如,格式错误的文件名)。 |
DEADLINE_EXCEEDED | 4 | 截止日期已过,操作无法完成。对于会改变系统状态的操作,即使操作已成功完成,也可能返回此错误。例如,来自服务器的成功响应可能已经被延迟很久。 |
NOT_FOUND | 5 | 未找到某些请求的实体(例如,文件或目录)。服务器开发者请注意: 如果请求被拒绝适用于整个用户类别,例如逐步特性发布或未记录的白名单,则可以使用“NOT_FOUND”。如果请求被拒绝适用于用户类别中的某些用户,例如基于用户的访问控制,则必须使用“PERMISSION_DENIED”。 |
ALREADY_EXISTS | 6 | 客户端尝试创建的实体(例如,文件或目录)已经存在。 |
PERMISSION_DENIED | 7 | 调用方没有权限执行指定的操作。“PERMISSION_DENIED”不得用于由于耗尽某些资源而导致的拒绝(对于这些错误,请改用“RESOURCE_EXHAUSTED”)。如果无法识别调用方,请勿使用“PERMISSION_DENIED”(对于这些错误,请改用“UNAUTHENTICATED”)。此错误代码不意味着请求有效,请求的实体存在或满足其他前提条件。 |
RESOURCE_EXHAUSTED | 8 | 某些资源已经用尽,例如每用户配额,或者整个文件系统的空间已满。 |
FAILED_PRECONDITION | 9 | 操作被拒绝,因为系统处于操作所需的状态之外。例如,要删除的目录非空,rmdir 操作应用于非目录等。服务实现者可以使用以下准则来在“FAILED_PRECONDITION”、“ABORTED”和“UNAVAILABLE”之间进行选择: (a) 如果客户端可以重试失败的调用,请使用“UNAVAILABLE”。(b) 如果客户端应该在更高级别重试,请使用“ABORTED”(例如,当客户端指定的测试并设置失败时,表示客户端应重新启动读取-修改-写入序列)。(c) 如果客户端在系统状态被明确修复之前不应重试,请使用“FAILED_PRECONDITION”。例如,如果由于目录非空而导致“rmdir”失败,则应返回“FAILED_PRECONDITION”,因为除非从目录中删除文件,否则客户端不应重试。 |
ABORTED | 10 | 操作被中止,通常是由于并发问题,例如序列器检查失败或事务中止。请参考上面的准则,以决定使用“FAILED_PRECONDITION”、“ABORTED”和“UNAVAILABLE”。 |
OUT_OF_RANGE | 11 | 操作尝试超出有效范围。例如,寻找或读取超出文件末尾的位置。与“INVALID_ARGUMENT”不同,此错误指示的问题在系统状态改变时可能会修复。例如,如果一个32位文件系统被要求读取不在范围 [0,2^32-1] 内的偏移量,它将生成“INVALID_ARGUMENT”,但如果被要求从当前文件大小之后的偏移量处读取,它将生成“OUT_OF_RANGE”。“续: FAILED_PRECONDITION”和”OUT_OF_RANGE”之间存在一定的重叠。我们建议在适用时使用”OUT_OF_RANGE”(更具体的错误),以便迭代通过空间的调用者可以轻松查找”OUT_OF_RANGE”错误以检测完成的情况。 |
UNIMPLEMENTED | 12 | 该操作未实现或在此服务中不受支持/启用。 |
INTERNAL | 13 | 内部错误。这意味着底层系统预期的某些不变条件已被破坏。该错误代码保留用于严重错误。 |
UNAVAILABLE | 14 | 服务当前不可用。这很可能是一种暂时的条件,可以通过使用指数退避进行重试来纠正。请注意,并非总是可以安全地重试非幂等操作。 |
DATA_LOSS | 15 | 无法恢复的数据丢失或损坏。 |
UNAUTHENTICATED | 16 | 请求没有有效的操作认证凭据。 |
Status Case
除了OK
外,我们也需要了解其他Code
产生的可能原因,如下表所示:
Case | Code | 产生的位置在 Client 或 Server |
---|---|---|
客户端应用程序取消了请求 | CANCELLED | Both |
截止时间到期之前服务器未返回状态 | DEADLINE_EXCEEDED | Both |
服务器上找不到方法 | UNIMPLEMENTED | Server |
服务器正在关闭 | UNAVAILABLE | Server |
服务器端应用程序抛出异常(或执行了除返回状态代码以外的其他操作,终止 RPC) | UNKNOWN | Server |
截止时间到期之前未收到响应。这可能发生在客户端无法将请求发送到服务器或服务器未能及时响应时。 | DEADLINE_EXCEEDED | Both |
连接中断前传输了一些数据(例如,请求元数据写入 TCP 连接) | UNAVAILABLE | Client |
无法解压缩,但支持压缩算法(客户端 -> 服务器) | INTERNAL | Server |
无法解压缩,但支持压缩算法(服务器 -> 客户端) | INTERNAL | Client |
客户端使用的压缩机制在服务器上不受支持 | UNIMPLEMENTED | Server |
服务器暂时资源不足(例如,达到了流量控制资源限制) | RESOURCE_EXHAUSTED | Server |
客户端没有足够的内存来保存服务器的响应 | RESOURCE_EXHAUSTED | Client |
流量控制协议违规 | INTERNAL | Both |
解析返回的状态时出错 | UNKNOWN | Client |
错误的身份验证元数据(凭据无法获取元数据,通道和调用上设置的不兼容凭据,: authority 元数据中设置的无效主机等) | UNAUTHENTICATED | Both |
请求基数违规(方法要求恰好一个请求,但客户端发送了其他数量的请求) | UNIMPLEMENTED | Server |
响应基数违规(方法要求恰好一个响应,但服务器发送了其他数量的响应) | UNIMPLEMENTED | Client |
解析响应协议时出错 | INTERNAL | Client |
解析请求协议时出错 | INTERNAL | Server |
发送或接收的消息大于配置的限制 | RESOURCE_EXHAUSTED | Both |
保持活动监视器超时 | UNAVAILABLE | Both |