作者:吳祐賓
最近在寫 Express.js API 時,被 AI 提示說直接字串拼接較不安全,建議使用指令處理。
但採用後原來的程式反而無法執行。檢查後才發現原來組合出來的路徑和我想的不一樣。
於是就做了一點測試比較:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | // node.js 的字串拼接函式比較: // 1. 字串直接拼接 console.log('/A/B/C' + '/fetch_emp'); // 輸出 (所有系統, 但 Windows 上可能不正確): /A/B/C/fetch_emp // 解釋: 直接使用 + 運算子。在 *nix (Linux/macOS) 上沒問題,但在 Windows 上可能因路徑分隔符 (\) 而出錯。不推薦。 // 2. path.join() - 跨平台安全 (推薦!) console.log(path.join('/A/B/C', '/fetch_emp')); // 輸出 (Windows): \A\B\C\fetch_emp // 輸出 (Linux/macOS): /A/B/C/fetch_emp (與上面相同,但更可靠) // 解釋: path.join() 根據 *當前作業系統* 自動選擇正確的分隔符。這是最安全、可靠的方法,確保跨平台兼容。 // 3. path.posix.join() - 單純傳入virtualDirPath console.log(path.posix.join('/A/B/C')); // 輸出 (所有系統): /A/B/C // 解釋: 只傳入一個參數時,作用等同於 path.normalize(),用來規範化路徑。 // 4. path.posix.join() + ./ (當前目錄) console.log(path.posix.join('/A/B/C', './')); // 輸出 (所有系統): /A/B/C/ // 解釋: path.posix.join() 強制使用 POSIX 分隔符 (/)。'./' 代表當前目錄,被絕對路徑 /A/B/C 吸收,最後加上/。 // 5. path.posix.join() + / (根目錄) console.log(path.posix.join('/A/B/C', '/')); // 輸出 (所有系統): /A/B/C/ // 解釋: path.posix 使用 / 分隔符。'/' 代表根目錄。因 /A/B/C 已是完整路徑, 最終結果為/A/B/C加上/,並處理掉多餘的 / // 6. path.posix.join() + /fetch_emp (強制 POSIX) console.log(path.posix.join('/A/B/C', '/fetch_emp')); // 輸出 (所有系統): /A/B/C/fetch_emp // 解釋: path.posix.join() 強制 / 分隔符。即使 '/fetch_emp' 開頭是 /,也會正確處理,避免雙斜線。 |
沒有留言:
張貼留言