通过pgAdmin的SQL查询调用postgres 12中带有json类型参数的存储函数会导致错误



我正在尝试调用postgres 12 DB中的一个存储函数,该函数接受1个json类型的参数并返回json类型结果。

功能如下:

CREATE OR REPLACE FUNCTION public.get_users(
data json,
OUT result json)
RETURNS json
LANGUAGE 'plv8'
COST 100
VOLATILE 

AS $BODY$const dataJson = JSON.parse(data);
const arg_id = dataJson.id;
const arg_token = dataJson.token;
const arg_ids = dataJson.ids.join(",");
result = {};
const getAuthUserResult = plv8.execute( 'SELECT id, token, deleted FROM public.users WHERE id = $1', [arg_id]);
const authUser = getAuthUserResult[0];
switch (true) {
case getAuthUserResult.length === 0: {
result.code = "ERR_SENDER_NOTFOUND";
break;
}
case authUser.token !== arg_token: {
result.code = "ERR_SENDER_INVALIDTOKEN";
break;
}
case authUser.deleted !== 0: {
result.code = "ERR_SENDER_DELETED";
break;
}
default: {
result.code = "OK"
}
}
if (result.code === "OK") {
result.users = plv8.execute( 'SELECT $1 FROM public.users WHERE id IN ($2)', ["name", arg_id]);
}
$BODY$;
ALTER FUNCTION public.get_users(json)
OWNER TO postgres;

函数必须采用带有键的json:;id"-对于请求发送者的id;令牌"-因为这是秘密;目标"-对于目标用户的id,如下所示:

{
"id": 448,
"token": "someToken",
"targets": [449, 450, 451]
}

但是当我尝试通过SQL查询调用函数时:

SELECT * FROM get_users('{"id":448,"token":"someToken","targets":[449,450,451]}');

我得到一个错误:

ERROR:  SyntaxError: Unexpected token o in JSON at position 1
CONTEXT:  undefined() LINE 0: [object Object]
SQL state: XX000

我已经仔细检查了json,它似乎是有效的。此外,许多资源提供了这种使用json类型参数调用函数的方式。我做这件事的方式会出什么问题?

问题实际上发生在函数代码intself中。

第一:

const dataJson = JSON.parse(data);
const arg_id = dataJson.id;

这是无效的。访问json值的正确方法很简单:

const arg_id = data.id;

第二:

return result;

结尾处缺少。

最新更新