n8n이 골때리는게 있다. 자기만의 데이터 형식을 가지고 있다는 것이다.
그냥 JS배열이나 객체가 아니다. 안에 내부 프라퍼티가 보이는 모양과 다르게 되어서
코드를 쓸때 "이걸" 명시해야 한다
#"아이템": n8n 의 특이한 자료구조와 숨겨져서 찾기 어려운 혼동의 원인
위에 내가 "이걸" 명시해야 한다 라고 썼는데
"이것"은..
json이라는 프라퍼티로서의 각 배열안 요소 즉 "아이템"이다!!!
바로 최외곽 [] 배열 바로 아래의 아이템인 경우 .json을 꼭 붙여 지칭해서
접근한다는 것이 n8n이 특수하게 지네만이 개발한 자료구조의 특징이다.
모양을 표현하자면 [{json: {}}, ... ]
식이다. (이것을 일반 js 식으로 표현하자면 [ {}, ...] 임을 알자. 주의해서 차이를 보자
아래 이 차이를 설명하겠다)
근데 왜 이게 어렵냐고?
바로 혼동하기 쉬운 함정이 n8n에 있기 때문이다.
바로 우리가 노드를 돌리면 input이나 output란에 자료들 모습을 볼수 있다
(자료들 나오는 곳 보면 위에 Schema, Table, Json) 중에 json을 누르면 보인다
근데 거기서는 저 json: 식으로 안나오고
우리가 아는 정상적인 [ {}, .. ] 식으로 json 이라는 키가 위에 말한 것처럼
안 보이는, 지극히 우리가 아는 js 식의 평범한 모습으로 보이기 때문이다.
즉 n8n의 인풋이나 아웃풋을 보면 [ ] 즉 배열안에 있고,
각 아이템이 {}인 경우 그걸 그냥 js문법으로 하면 안되고
저렇게 지네만의 숨겨진 특이한 자료형으로 바꿔서 노드에서 돌아가기에
그 때문에 .json 같은 전혀 이상한 프라퍼티를 명시해냐 하는 거다.
(위에 두개 차이 예시를 보자. 원래 js 식의 구조와 n8n이 가진 배열의 모습 구조 차이를)
.json으로 그 한 아이템을
명시해서 코드에 지칭해서 프라퍼티 처럼 써야 한다.
아래를 보자.
[ { json: {...}, binary: {...} },
{ json: {...} } ]
[] 안의 바로 밑 한개의 아이템이 {} 즉 js 객체 즉 오브젝트다.
이를 그냥 js로 보면 저 배열이 x라면 x 후에 [0]을 하면
접근이 가능할 거 같다.
근데 이제 위에 배운 지식을 응용해 보면 code js 노드에서는 이러면 안된다.
안에가 숨겨진 형태로 json: 하고 숨겨진 키가 있기 때문이다.
x.json 이렇게 해줘야 한다.
그러면 이런 의문도 가능하다.
하위 구조에 다시 js object 즉 {} 구조가 또 있다면
계속 저런 식으로 연속해서 해야 하나?
아니다. 저 최상단 위계 [ ] 의 바로 밑의 객체만 그렇게 지칭하고 그 하위부터는 .json을 안 붙여도 된다.