n8nでワークフローを組んでいると、
・前のノードのデータが消える
・次のノードでundefinedになる
・保存用IDが消えている
といった問題にぶつかることがあります。
特にJavaScriptノード(Codeノード)を使い始めた頃にかなりハマりやすいです。
実際、自分もこれが原因で、
・重複判定が壊れる
・保存処理が動かない
・同じ投稿が繰り返される
といった問題が発生しました。
この記事では、n8nでデータが消える原因と対処法を、実体験ベースで整理します。
よくある症状
まず、よくあるのがこの状態です。
・前のノードでは値がある
・次のノードでundefinedになる
・途中からsource_tweet_idが消える
・media_keyがなくなる
一見するとn8nのバグっぽく見えますが、原因はかなりシンプルです。
原因は「returnの上書き」
一番多い原因はこれです。
return {
json: {
text: "生成した文章"
}
}一見問題なさそうに見えますが、これをやると、
それまでのデータが全部消えます。
なぜデータが消えるのか
n8nでは、各ノードがjsonデータを受け渡しながら動いています。
例えば前のノードで、
{
"source_tweet_id": "12345",
"media_key": "abcde"
}というデータを持っていたとします。
しかし次のノードで、
return {
json: {
text: "生成した文章"
}
}としてしまうと、
{
"text": "生成した文章"
}だけに置き換わります。
つまり、
- source_tweet_id
- media_key
などが全部消えます。
実際に起きた問題
自分の場合、これが原因で、
・重複判定用IDが消える
・PostgreSQL保存が壊れる
・既出除外が効かなくなる
という問題が発生しました。
結果として、
同じ投稿が何度も投稿される状態になっていました。
かなり危険です。
正しい書き方
これを防ぐには、既存データを残しながら追加します。
return {
json: {
...$json,
text: "生成した文章"
}
}これで、
- 元のデータ
- 新しく追加するデータ
を両方保持できます。
…$json は何をしているのか
...$jsonこれは、「今までのデータを全部コピーする」という意味です。
つまり、
{
"source_tweet_id": "12345",
"media_key": "abcde"
}を残したまま、
{
"source_tweet_id": "12345",
"media_key": "abcde",
"text": "生成した文章"
}のように追加できます。
undefinedになるときの確認ポイント
もしundefinedになる場合は、まずここを確認してください。
① 前のノードに値があるか
n8nは前のノードの出力を受け渡しています。
つまり、前のノードで既に消えている場合もあります。
② returnで上書きしていないか
これが一番多いです。
return {
json: {
text: "test"
}
}になっていないか確認してください。
③ ノード出力を確認する
n8nは各ノードの出力を確認できます。
どのタイミングで値が消えたかを見ると、原因がかなり見つけやすいです。
対処のコツ
迷ったら、まずこれです。
...$json基本的に、
「追加する」
「上書きしない」
という意識で組むと壊れにくくなります。
まとめ
n8nでデータが消える原因は、ほとんどがこれです。
returnでjsonを上書きしている
特にCodeノードを使い始めた頃はかなりハマります。
重要なのは、
「新しいデータを作る」のではなく
「既存データを残しながら追加する」
という考え方です。

