Обновить

Комментарии 4

Виноват не знак доллара, а тот, кому лень было сделать по уму через подготовленные запросы с плейсхолдерами. А может и с нормальными полями таблицы вместо jsonb.

Надо еще обезопаситься от имени “drop table users”, а то с формированием запроса из строки можно нарваться

Нода подставляет значение в шаблон, и подстановка идёт через JS-замену. А в строке замены $ — служебный символ.

То есть мои $$ схлопывались в один $ ещё до того, как SQL доходил до Postgres.

следующий человек, который напишет $$ по привычке, наступит туда же.

Так может, перед тем, как передать строку в то место, где $$ схлопывается в $, надо просто перевести все знаки "$" в спецпоследовательности "$$"?

Ловушка со спецсимволами в String.prototype.replace довольно тонкий баг на стыке JS и Postgres, про который легко забыть при использовании кавычек $$. Логика fail-closed для дедупликации тут действительно верное решение, а то любой скрытый HTTP 200 от ноды n8n при ошибке SQL гарантированно множит сущности.

Так почему для изоляции базы изначально была выбрана схема с передачей сырого SQL-запроса через вебхук mk-db-exec, а не классический вызов хранимых процедур Postgres, куда JSON с параметрами можно было бы пробрасывать целиком, избегая проблем с шаблонизацией строк на стороне n8n?

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации