編輯欄位節點 - 問題

在執行工作流程時,Edit Fields 節點對 modifyTime 的輸出為 NULL(表達式:{{ $json.modifyTime.substring(0, 10) }})。手動執行節點時,輸出正確 - 請參閱附件。

請分享你的工作流程以提供更多背景資訊

@Massimiliano_Bellini 聽起來傳入的其中一個項目沒有設定 modifyTime,所以 substring 對 undefined 發生異常。手動執行使用固定資料,但完整執行會遍歷每個項目。防護一下:

{{ ($json.modifyTime ?? '').substring(0, 10) }}

也檢查一下提供資料的節點,可能是在該欄位遺漏時返回項目

@Massimiliano_Bellini ,你也可以加入空值檢查

{{ $json.modifyTime ? $json.modifyTime.substring(0, 10) : null }}

非常簡單的工作流

我移除了一個沒有「modifyTime」的項目,但當我運行工作流程時仍然得到相同的 NULL - 請查看附件

大家好,快速更新:作為解決方案,我添加了日期和時間節點來格式化日期 - 確保該節點的其他輸入也包含在其輸出中。效果很好。

我仍有一個問題:我之前的工作流中是否出錯,還是編輯欄位 (Set) 節點 3.4 版本中存在錯誤?

很好的故障排除,@Massimiliano_Bellini!很高興 Date & Time 節點的解決方案讓事情有所進展。

回答你的問題 - 這更可能是一個資料不一致的問題,而不是 Edit Fields 本身的錯誤。以下是可能發生的情況:

FTP list 節點從 FTP 伺服器返回文件,其中某些文件可能確實在伺服器端沒有設置 modifyTime 值(null 或完全缺失)。當你通過「Execute Step」手動運行該節點時,你可能只是查看測試輸出中的第一項,該項恰好有有效的 modifyTime。但在完整的工作流程運行中,所有 9 個項目都會被處理,其中某些項目沒有該字段 - 這就是你收到 NULL 的原因。

表達式 {{ $json.modifyTime.substring(0, 10) }}modifyTime 為 null 或 undefined 時會拋出 TypeError,而 n8n 會在這種情況下無聲地為該字段返回 null。

正確的修復方法是防止 null,正如其他人建議的那樣:

{{ ($json.modifyTime ?? '').substring(0, 10) }}

或者,如果你想為沒有修改時間的文件保留 null:

{{ $json.modifyTime ? $json.modifyTime.substring(0, 10) : null }}

你的 Date & Time 節點方法也很有效,因為它強制 n8n 在一個專用步驟中處理日期時間格式化,該步驟可以更優雅地處理 null 情況。

如果這能澄清事情,請隨時將其中一個回覆標記為解決方案,這樣其他有相同 FTP + null 字段問題的人可以找到這個討論串!

嗨 Jay,感謝你花時間查看我的問題。我也要感謝那些寄給我評論和建議的其他人。根據你們所說的一切,我傾向於認為我所遇到的問題實際上並不是一個錯誤。不過……FTP 節點為每個項目/文件返回正確設定的 “modifyTime” 值。請看一下我剛剛執行的新測試——你可以看到當你執行工作流程時,格式化的日期被用 " 字符括起來

Edit Fields node - issue (debug).pdf (258.5 KB)

@Massimiliano_Bellini 感謝你分享除錯 PDF!那個引號包裝的行為確實相當有啟發性。

當格式化日期顯示為 "2025-01-01" (帶有字面引號字符)時,通常表示以下兩種情況之一:

1. FTP 節點的值是已經包含轉義引號的 JSON 字串。 例如,原始值可能是 "2025-01-01" 作為字串而不是 2025-01-01。你可以用以下方式去除它們:

{{ $json.modifyTime.replace(/"/g, '') }}

2. 日期與時間節點輸出的是帶引號的字串,因為輸入沒有被解析為適當的日期物件。嘗試將「輸入」欄位設定為「自動偵測」或明確設定輸入格式。

最快的測試方式:在 FTP 節點之後的代碼節點中,記錄 typeof $input.first().json.modifyTime。如果它返回 string 且值包含引號,你就是遇到第 1 種情況。在傳遞給日期與時間節點之前去除引號。

你也可以直接在編輯欄位中內聯操作:

{{ $json.modifyTime?.replace(/"/g, '').substring(0, 10) }}

這樣可以一次處理引號去除和空值檢查。

嗨 Jay,非常感謝你的回饋。

基於你的建議,我在第一個 Edit Fields 節點之後立即添加了另一個 Edit Fields 節點(見附加的 PDF),現在即使運行整個工作流程,我也能獲得正確的 formattedDate。很好。

但是,如果我在第一個 Edit Fields 節點中使用表達式 {{ $json.modifyTime.replace(/"/g, ‘’).substring(0, 10) }},那麼當我運行整個工作流程時,OUTPUT 中會出現 NULL 值。

Edit Fields node - issue (debug 2).pdf (192.0 KB)

第一個 Edit Fields 節點中的 NULL 輸出發生原因是運算式 {{ $json.modifyTime.replace("/", "").substring(0, 10) }} 在該時點運行時,運行的值可能仍是原始時間戳物件(不是字串)。FTP 節點經常將 modifyTime 作為 JavaScript Date 物件或數字返回,而不是字串,因此 .replace() 會以靜默方式失敗並輸出 null。嘗試先進行轉換:{{ new Date($json.modifyTime).toISOString().substring(0, 10) }} - 這會在切片前強制將其轉換為適當的 ISO 字串。如果 modifyTime 已經是格式化的字串(如「2026/05/14」),那麼 {{ $json.modifyTime.replace(/\//g, "-") }}(使用正規表達式,而不僅是「/」)可以正確處理所有斜線。

問題已解決