通过来自 pgAdmin 的 SQL 查询使用 json 类型参数调用 postgres 12 中的存储函数会导致错误
Calling stored function in postgres 12 with json type argument by SQL query from pgAdmin results in error
我正在尝试调用 postgres 12 DB 中的存储函数,该函数采用 json 类型的 1 个参数和 json 类型的 returns 结果。
函数是这样的:
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 = ', [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 FROM public.users WHERE id IN ()', ["name", arg_id]);
}
$BODY$;
ALTER FUNCTION public.get_users(json)
OWNER TO postgres;
该函数必须采用带有键的 json:“id”- 请求发送者的 id,“token”- 它的秘密,“targets”- 目标用户的 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 类型参数调用函数的方式。我这样做的方式有什么问题吗?
问题实际上出在函数代码本身。
第一个:
const dataJson = JSON.parse(data);
const arg_id = dataJson.id;
这是无效的。访问 json 值的正确方法很简单:
const arg_id = data.id;
第二个:
return result;
最后少了
我正在尝试调用 postgres 12 DB 中的存储函数,该函数采用 json 类型的 1 个参数和 json 类型的 returns 结果。
函数是这样的:
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 = ', [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 FROM public.users WHERE id IN ()', ["name", arg_id]);
}
$BODY$;
ALTER FUNCTION public.get_users(json)
OWNER TO postgres;
该函数必须采用带有键的 json:“id”- 请求发送者的 id,“token”- 它的秘密,“targets”- 目标用户的 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 类型参数调用函数的方式。我这样做的方式有什么问题吗?
问题实际上出在函数代码本身。
第一个:
const dataJson = JSON.parse(data);
const arg_id = dataJson.id;
这是无效的。访问 json 值的正确方法很简单:
const arg_id = data.id;
第二个:
return result;
最后少了