Схема ответа функции PostgREST случайно несовместима?
При вызове функции REST, которая возвращает JSON, и запросе схемы возврата объекта, иногда (кажется случайным образом) результат оборачивается в объект, имя функции которого является единственным ключом. Это делает анализ результатов немного утомительным, например:
С функцией БД:
CREATE OR REPLACE FUNCTION api.conf_test(param TEXT)
RETURNS JSON AS $$
BEGIN
RETURN JSON_BUILD_OBJECT('auth', param, 'perm', param);
END;
$$
LANGUAGE plpgsql STABLE;
GRANT EXECUTE ON FUNCTION api.conf_test(TEXT) TO anon, rest_user_max;
И вызов REST:
return ajax({
url: 'https://' + site.domain + '/api/v1/rpc/conf_test',
type: 'POST',
data: JSON.stringify({param: user.id}),
headers: {
'Accept': 'application/vnd.pgrst.object+json',
'Content-Type': 'application/json'
}
}).then(function(result) {
if (result.data.conf_test === undefined) {
site.jwts = result.data;
} else {
site.jwts = result.data.conf_test;
}
}).catch(function(e) {
site.jwts = null;
throw e;
});
Иногда ответом является:
{"auth" : "12213", "perm" : "12213"}
И в других случаях это:
{"conf_test" : {"auth" : "12213", "perm" : "12213"}}
Я видел, как он переключался с одного формата на другой сам по себе на данном сервере. Кто-нибудь знает, почему это происходит?
РЕДАКТИРОВАТЬ:
Примечание. Запрос REST не имеет заголовка авторизации, поскольку в реальной жизни это запрос на получение двух JWT (auth и perm). Не уверен, что это имеет значение, просто роль PostgreSQL в этом случае "анон".
1 ответ
Похоже, что моя проблема, вероятно, была связана с тем, что кэш схемы PostgREST не обновлялся после внесения изменений в схему. Я не видел проблемы с тех пор, как реализовал автоматическую перезагрузку схемы, как описано в последних документах.