错误
-PostgREST 错误消息遵循 PostgreSQL 错误结构。它包括 MESSAGE、DETAIL、HINT、ERRCODE,并将向响应添加 HTTP 状态码。
来自 PostgreSQL 的错误
-PostgREST 将转发来自 PostgreSQL 的错误。例如,在约束失败时
-POST /projects HTTP/1.1
-HTTP/1.1 400 Bad Request
-Content-Type: application/json; charset=utf-8
-{
- "code": "23502",
- "details": "Failing row contains (null, foo, null).",
- "hint": null,
- "message": "null value in column \"id\" of relation \"projects\" violates not-null constraint"
-}
-HTTP 状态码
-PostgREST 将 PostgreSQL 错误代码 转换为 HTTP 状态,如下所示
-PostgreSQL 错误代码 |
-HTTP 状态 |
-错误描述 |
-
|---|---|---|
08* |
-503 |
-pg 连接错误 |
-
09* |
-500 |
-触发操作异常 |
-
0L* |
-403 |
-无效授予者 |
-
0P* |
-403 |
-无效角色规范 |
-
23503 |
-409 |
-外键冲突 |
-
23505 |
-409 |
-唯一性冲突 |
-
25006 |
-405 |
-只读 SQL 事务 |
-
25* |
-500 |
-无效的事务状态 |
-
28* |
-403 |
-无效的授权规范 |
-
2D* |
-500 |
-无效的事务终止 |
-
38* |
-500 |
-外部例程异常 |
-
39* |
-500 |
-外部例程调用 |
-
3B* |
-500 |
-保存点异常 |
-
40* |
-500 |
-事务回滚 |
-
53400 |
-500 |
-配置限制超出 |
-
53* |
-503 |
-资源不足 |
-
54* |
-500 |
-过于复杂 |
-
55* |
-500 |
-对象不在先决条件状态 |
-
57* |
-500 |
-操作员干预 |
-
58* |
-500 |
-系统错误 |
-
F0* |
-500 |
-配置文件错误 |
-
HV* |
-500 |
-外部数据包装器错误 |
-
P0001 |
-400 |
-“raise”的默认代码 |
-
P0* |
-500 |
-PL/pgSQL 错误 |
-
XX* |
-500 |
-内部错误 |
-
42883 |
-404 |
-未定义函数 |
-
42P01 |
-404 |
-未定义表 |
-
42P17 |
-500 |
-无限递归 |
-
42501 |
-
-
-如果已认证,则返回 403,
-否则返回 401
- |
-权限不足 |
-
其他 |
-400 |
-- |
来自 PostgREST 的错误
-来自 PostgREST 本身的错误保持相同的结构,但在 code 字段中使用 PGRST 前缀。例如,当查询在 schema 缓存 中不存在的函数时
POST /rpc/nonexistent_function HTTP/1.1
-HTTP/1.1 404 Not Found
-Content-Type: application/json; charset=utf-8
-{
- "hint": "...",
- "details": null
- "code": "PGRST202",
- "message": "Could not find the api.nonexistent_function() function in the schema cache"
-}
-PostgREST 错误代码
-PostgREST 错误代码的格式为 PGRSTgxx。
-
-
PGRST是区分错误与 PostgreSQL 错误的前缀。
-g是错误组
-xx是组中的错误标识符。
-
组 0 - 连接
-与数据库的连接相关。
-代码 |
-HTTP 状态 |
-描述 |
-
|---|---|---|
PGRST000 - |
-503 |
-由于 db-uri 不正确或 PostgreSQL 服务未运行,无法连接到数据库。 |
-
PGRST001 - |
-503 |
-由于内部错误,无法连接到数据库。 |
-
PGRST002 - |
-503 |
-在构建 Schema Cache 时无法连接到数据库,因为 PostgreSQL 服务未运行。 |
-
PGRST003 - |
-504 |
-请求在等待连接池可用时超时。请参阅 db-pool-acquisition-timeout。 |
-
组 1 - API 请求
-与 HTTP 请求元素相关。
-代码 |
-HTTP 状态 |
-描述 |
-
|---|---|---|
PGRST100 - |
-400 |
-- |
PGRST101 - |
-405 |
-对于 函数,只允许使用 |
-
PGRST102 - |
-400 |
-发送了无效的请求主体(例如空主体或格式错误的 JSON)。 |
-
PGRST103 - |
-416 |
-为 限制和分页 指定了无效的范围。 |
-
PGRST105 - |
-405 |
-执行了无效的 PUT 请求。 |
-
PGRST106 - |
-406 |
-在 切换模式 时指定的模式不存在于 db-schemas 配置变量中。 |
-
PGRST107 - |
-415 |
-请求中发送的 |
-
PGRST108 - |
-400 |
-过滤器应用于未在查询字符串的 |
-
PGRST109 - |
-400 |
-使用限制来限制删除或更新必须包含唯一列的排序。请参阅 限制更新/删除。 |
-
PGRST110 - |
-400 |
-当使用限制来限制删除或更新时,修改的行数超过限制中指定的最大值。请参阅 限制更新/删除。 |
-
PGRST111 - |
-500 |
-设置了无效的 |
-
PGRST112 - |
-500 |
-状态代码必须是正整数。请参阅 响应状态代码。 |
-
PGRST114 - |
-400 |
-- |
PGRST115 - |
-400 |
-对于使用 PUT 的 UPSERT,当查询字符串中的主键与主体中的主键不同时。 |
-
PGRST116 - |
-406 |
-在请求单个响应时,返回了多个或没有项目。请参阅 单数或复数。 |
-
PGRST117 - |
-405 |
-请求中使用的 HTTP 动词不受支持。 |
-
PGRST118 - |
-400 |
-无法使用相关表对结果进行排序,因为它们之间没有多对一或一对一关系。 |
-
PGRST119 - |
-400 |
-无法在相关表上使用扩展运算符,因为它们之间没有多对一或一对一关系。 |
-
PGRST120 - |
-400 |
-嵌入式资源只能使用 |
-
PGRST121 - |
-500 |
-PostgREST 无法解析 RAISE |
-
PGRST122 - |
-400 |
-在 |
-
第 2 组 - 架构缓存
-与 架构缓存 相关。大多数情况下,这些错误可以通过 架构缓存重新加载 解决。
-代码 |
-HTTP 状态 |
-描述 |
-
|---|---|---|
PGRST200 - |
-400 |
-由过时的外键关系引起,否则任何嵌入式资源或关系本身可能不存在于数据库中。 |
-
PGRST201 - |
-300 |
-发出了不明确的嵌入请求。请参阅 多个外键关系上的外键连接。 |
-
PGRST202 - |
-404 |
-由过时的函数签名引起,否则该函数可能不存在于数据库中。 |
-
PGRST203 - |
-300 |
-由于请求具有相同参数名称但类型不同的重载函数,或使用 |
-
PGRST204 - |
-400 |
-当 |
-
第 3 组 - JWT
-与使用 JWT 进行身份验证过程相关。您可以参考 教程 1 - 金钥匙 获取有关如何实现身份验证的示例,以及 身份验证页面 获取有关此过程的更多信息。
-代码 |
-HTTP 状态 |
-描述 |
-
|---|---|---|
PGRST300 - |
-500 |
-配置中缺少 JWT 密钥。 |
-
PGRST301 - |
-401 |
-与 JWT 验证相关的任何错误,这意味着提供的 JWT 在某种程度上无效。 |
-
PGRST302 - |
-401 |
-尝试在 db-anon-role 中未设置匿名角色的情况下,在未进行 身份验证 的情况下进行请求。 |
-
第 X 组 - 内部
-内部错误。如果您遇到任何这些错误,您可能遇到了 PostgREST 错误,请 打开一个问题,我们将很乐意修复它。
-代码 |
-HTTP 状态 |
-描述 |
-
|---|---|---|
PGRSTX00 - |
-500 |
-与用于连接到数据库的库相关的内部错误。 |
-
自定义错误
-您可以使用函数上的 RAISE 语句 自定义错误。
-使用 HTTP 状态代码引发错误
-可以通过在 函数 中引发 SQL 异常来实现自定义状态代码。例如,以下是一个始终以错误响应的函数
-CREATE OR REPLACE FUNCTION just_fail() RETURNS void
- LANGUAGE plpgsql
- AS $$
-BEGIN
- RAISE EXCEPTION 'I refuse!'
- USING DETAIL = 'Pretty simple',
- HINT = 'There is nothing you can do.';
-END
-$$;
-调用函数返回 HTTP 400,并带有主体
-{
- "message":"I refuse!",
- "details":"Pretty simple",
- "hint":"There is nothing you can do.",
- "code":"P0001"
-}
-自定义 HTTP 状态码的一种方法是根据 PostgREST 错误到状态码映射 抛出特定异常。例如,RAISE insufficient_privilege 将根据情况返回 HTTP 401/403。
为了更精确地控制 HTTP 状态码,请抛出 PTxyz 类型的异常。例如,要返回 HTTP 402,请抛出 PT402
RAISE sqlstate 'PT402' using
- message = 'Payment Required',
- detail = 'Quota exceeded',
- hint = 'Upgrade your plan';
-返回值
-HTTP/1.1 402 Payment Required
-Content-Type: application/json; charset=utf-8
-
-{
- "message": "Payment Required",
- "details": "Quota exceeded",
- "hint": "Upgrade your plan",
- "code": "PT402"
-}
-使用 RAISE 添加 HTTP 头
-为了完全控制头信息和状态,您可以抛出 PGRST SQLSTATE 错误。您可以通过在 PostgreSQL 错误消息字段中添加 code、message、detail 和 hint 作为 JSON 对象来实现。这里,details 和 hint 是可选的。类似地,status 和 headers 必须作为 JSON 对象添加到 SQL 错误详细信息字段中。例如
RAISE sqlstate 'PGRST' USING
- message = '{"code":"123","message":"Payment Required","details":"Quota exceeded","hint":"Upgrade your plan"}',
- detail = '{"status":402,"headers":{"X-Powered-By":"Nerd Rage"}}';
-返回值
-HTTP/1.1 402 Payment Required
-Content-Type: application/json; charset=utf-8
-X-Powered-By: Nerd Rage
-
-{
- "message": "Payment Required",
- "details": "Quota exceeded",
- "hint": "Upgrade your plan",
- "code": "123"
-}
-对于非标准 HTTP 状态,您可以选择添加 status_text 来描述状态码。对于状态码 419,详细信息字段可能如下所示
detail = '{"status":419,"status_text":"Page Expired","headers":{"X-Powered-By":"Nerd Rage"}}';
-如果 PostgREST 无法解析 JSON 对象 message 和 detail,它将抛出 PGRST121 错误。请参阅 PostgREST 错误。