Postgres plv8 - пользовательская ошибка - потерять пользовательские свойства
Пользовательские ошибки теряют пользовательские свойства
Какие шаги воспроизведут проблему:
создать функцию
CREATE OR REPLACE FUNCTION public.utils ()
RETURNS void AS
$body$
this.dbError = function(message){
this.message = (message || '');
};
dbError.prototype = Error.prototype;
$body$
LANGUAGE 'plv8'
VOLATILE
RETURNS NULL ON NULL INPUT
SECURITY DEFINER
COST 100;
создать функцию триггера
CREATE OR REPLACE FUNCTION public.test_trigger func ()
RETURNS trigger AS
$body$
var fn = plv8.find_function('public.utils');
fn();
var err = new dbError('this is a dbError');
err.someProp = 'lalala';
throw err;
return NEW;
$body$
LANGUAGE 'plv8'
VOLATILE
CALLED ON NULL INPUT
SECURITY DEFINER
COST 100;
установите этот триггер на любой таблице вместо события и попытайтесь выполнить его
DO $$
plv8.find_function('public.utils')();
try{
plv8.execute('insert into Temp (field) value ($1)', [100]);
} catch(ex){
plv8.elog(NOTICE, ex instanceof dbError);
plv8.elog(NOTICE, ex.message);
plv8.elog(NOTICE, ex.someProp);
}
$$ LANGUAGE plv8;
посмотрим
true
this is a dbError
undefined
Каков ожидаемый результат?
true
this is a dbError
lalala
если я делаю это в одной области - я получаю правильный результат
DO $$
this.dbError = function(message){
this.message = (message || '');
};
dbError.prototype = Error.prototype;
try{
var err = new dbError('this is a dbError');
err.someProp = 'lalala';
throw err;
} catch(ex){
plv8.elog(NOTICE, ex instanceof dbError);
plv8.elog(NOTICE, ex.message);
plv8.elog(NOTICE, ex.someProp);
}
$$ LANGUAGE plv8;
результат:
true
this is a dbError
lalala