執行 Node.js 提示 #!/usr/bin/env node 錯誤的解決方法

最近遇到幾份程式是從 Windows 專案移過來的,我在 Build 完 Docker 後執行發現它會提示以下錯誤

/usr/src/app/bin/https:1
#!/usr/bin/env node
^
SyntaxError: Invalid or unexpected token
Object.compileFunction (node:vm:352:18)
wrapSafe (node:internal/modules/cjs/loader:1033:15)
Module._compile (node:internal/modules/cjs/loader:1069:27)
Object.Module._extensions..js (node:internal/modules/cjs/loader:1159:10)
Module.load (node:internal/modules/cjs/loader:981:32)
Function.Module._load (node:internal/modules/cjs/loader:822:12)
Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:77:12)

問題原因

發生這個問題主要是因為它在 Windows 的編碼是使用一種叫做 UTF-8 with BOM 的編碼格式,這種格式直接 Build 進去 Docker 會發生錯誤,所以需要把它轉變成正常的 UTF-8 格式。

使用 VS Code 開發的解決方法

如果是使用 VS Code 開發其實右下角可以直接點擊右下角的 UTF-8 with BOM 然後點選 Save with Encoding 再點擊 UTF-8 就可以把這個檔案轉成 UTF-8 格式了

大量轉編碼需求解決方法

不過如果你有大量的檔案或是一整個專案需要轉碼那這個功能大概會轉到瘋掉,這時候就可以依靠一個叫做 dos2unix 的程式來實現大量檔案的轉碼

在 Mac 下安裝只要直接使用 brew 就可以直接安裝

brew install dos2unix

安裝後搭配 find 指令就可以讓指令掃描所有檔案並且轉碼了

find . -type f -print0 | xargs -0 dos2unix

參考資料