Merge и потеря связей между items
Содержание курса
В прошлом уроке мы разобрали, как pairedItem прокидывает ссылку от output-item к source item и как выражение $('Node').item использует эту цепочку, чтобы достать нужные данные. Теперь в игру входит Merge — нода с двумя входами и одним выходом. Именно здесь цепочка ломается чаще всего, и ломается предсказуемо.
Merge по позиции: механизм паросочетания и ошибка item linking
Режим Combine by Position работает по простому правилу: item с индексом 0 первого входа соединяется с item с индексом 0 второго, item с индексом 1 — с item с индексом 1, и так далее. Порядок в массиве — единственный критерий. Никакого поиска по содержимому полей, никакой проверки ключей.
В fixture обе ветки ответвляются от одних и тех же трёх запросов: R-101, R-102, R-103. Первая ветка сохраняет этот порядок и приходит на вход 1 Merge как [R-101, R-102, R-103]. Вторая ветка где-то по пути переставляет элементы и приходит на вход 2 как [R-103, R-101, R-102].
Merge по позиции формирует три пары:
| Индекс | Вход 1 | Вход 2 | Пара верная? |
|---|---|---|---|
| 0 | R-101 | R-103 | ✗ |
| 1 | R-102 | R-101 | ✗ |
| 2 | R-103 | R-102 | ✗ |
В этой конкретной циклической перестановке неверны все три пары. В общем случае любая перестановка делает позиционное соответствие ненадёжным и портит все затронутые позиции — поэтому на Combine by Position нельзя полагаться, если порядок веток не гарантирован явно.
Теперь важно понять, что происходит с item linking. Каждый из трёх output-items Merge несёт pairedItem, который указывает на входные items обоих входов. Output с индексом 0 ссылается на R-101 (вход 1) и на R-103 (вход 2) — два разных source item из разных исходных запросов. Когда downstream-нода пишет $('Source Requests').item, n8n должен подняться по цепочке pairedItem и найти один source item. Но ancestry output-item с индексом 0 одновременно ведёт к двум разным исходным записям.
Поведение n8n в этой ситуации определено: если item-link thread указывает более чем на один item предыдущей ноды, выражение .item бросает ошибку Multiple matching items for expression. Произвольного выбора одного из двух источников не происходит — n8n отказывается резолвить выражение.
Важно отличать этот симптом от другого: сами JSON-поля в output-item Merge объединены тихо и без ошибок — вы получите объект с данными R-101 из первого входа и данными R-103 из второго. Если downstream-нода читает только эти уже объединённые поля напрямую, ошибки не будет, но данные окажутся перемешаны незаметно. Ошибка Multiple matching items for expression возникает именно при попытке подняться по цепочке pairedItem через выражение .item, а не при чтении полей из объединённого JSON.
