Merge и потеря связей между items
Содержание курса
Диагностика через execution data: нахождение первого расхождения request_id
Зная, что паросочетание сломано, нужно точно установить, в каком output-item это происходит впервые. Execution data даёт всё необходимое — но здесь есть техническая сложность: оба входа Merge используют поле с одним и тем же именем request_id. По умолчанию при конфликте имён Merge перезаписывает значение, отдавая приоритет Input 2. В итоге в output-item остаётся только одно поле request_id, и сравнить оба исходных значения «в одной строке» напрямую невозможно.
Чтобы обойти это ограничение, до Merge добавьте в каждую ветку ноду Edit Fields и явно переименуйте поле: в первой ветке request_id → request_id_input1, во второй request_id → request_id_input2. После этого Merge объединит два различимых поля без конфликта, и их значения будут видны в output-item рядом. Добавив эти ноды, вы сможете воспроизвести таблицу ниже.
Алгоритм диагностики. Сначала откройте execution data нод обеих веток непосредственно перед Merge — там вы видите два независимых массива items с их request_id. Порядок в fixture:
- Вход 1:
["R-101", "R-102", "R-103"] - Вход 2:
["R-103", "R-101", "R-102"]
Это уже достаточное доказательство проблемы: если входные массивы упорядочены по-разному, позиционное соответствие заведомо неверно. Данные до Merge — первичный и наиболее надёжный источник.
Чтобы подтвердить расхождение в output, посмотрите на поля request_id_input1 и request_id_input2 в каждом output-item:
| Output-item | request_id_input1 | request_id_input2 | Совпадают? |
|---|---|---|---|
| 0 | R-101 | R-103 | ✗ |
| 1 | R-102 | R-101 | ✗ |
| 2 | R-103 | R-102 | ✗ |
Первое расхождение — сразу на item с индексом 0. Именно здесь pairedItem output-item тянется к двум несовместимым source items. Если downstream-нода использует выражение вроде $('Source Requests').item.json.payload, n8n пытается подняться по этому сломанному pairedItem и бросает ошибку Multiple matching items for expression: однозначно выбрать один source item невозможно.
Важный вывод для практики: основной диагностический шаг — сравнение порядка входных массивов до Merge, а не чтение output. Output с переименованными полями лишь подтверждает расхождение наглядно. Когда несовпадение видно уже в первой строке, проверять остальные нет необходимости: любая перестановка делает ненадёжными все затронутые позиции.
