Комментарии 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?

Робот написал одному человеку пять раз. Виноват оказался знак доллара