Skip to content
[Ts.ED,tsed] SyntaxError: Cannot use import statement outside a module
web-tips
2020-07-23

https://akibakokoubou.jp/2020/07/09/nodeでrestのおもちゃを検討中/ のテストデプロイにGCPの App Engineを使っていたのだが、ある時期から SyntaxError: Cannot use import statement outside a module というエラーが出だしてよく分からない状態に。

SyntaxError: Cannot use import statement outside a module
    at wrapSafe (internal/modules/cjs/loader.js:1054:16)
    at Module._compile (internal/modules/cjs/loader.js:1102:27)
SyntaxError: Cannot use import statement outside a module
    at wrapSafe (internal/modules/cjs/loader.js:1054:16)
    at Module._compile (internal/modules/cjs/loader.js:1102:27)

ローカル環境ではエラーは出ず、どうもロジックの話ではなく typescript, javascriptの モジュール設定関係の話のようだが、このあたりは話がややこしすぎて訳がわからない。試行錯誤とネット検索しまくりをした結果、 nest で同じ系統のエラーの話と解決が載ってた。 https://masahiro.me/2020/03/nestjs-syntaxerror-cannot-import-statment-outside-a-module/

何かソースのパス関係の話だとするとと見直したら、ああ似たような部位が。

server.ts 内
 
 componentsScan: [
    `./services/**/**.js`,
    `${rootDir}/protocols/*{.ts,.js}` // passport認証関係のコンポーネント登録
  ],
server.ts 内
 
 componentsScan: [
    `./services/**/**.js`,
    `${rootDir}/protocols/*{.ts,.js}` // passport認証関係のコンポーネント登録
  ],
  componentsScan: [
    `./services/**/**.js`,
    process.env.NODE_ENV === 'production' ?
      `dist/protocols/*.js` : 
        `${rootDir}/protocols/*{.ts,.js}` // 書き換え
  ],
  componentsScan: [
    `./services/**/**.js`,
    process.env.NODE_ENV === 'production' ?
      `dist/protocols/*.js` : 
        `${rootDir}/protocols/*{.ts,.js}` // 書き換え
  ],

に書き換えたら解決(distだけだとローカルで今度は正体不明な単体テストエラーに。。。)。

あと表題の件ではないが SyntaxError: Unexpected token というエラーも。

SyntaxError: Unexpected token {
    at Module._compile (internal/modules/cjs/loader.js:723:23)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
SyntaxError: Unexpected token {
    at Module._compile (internal/modules/cjs/loader.js:723:23)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)

こっちは GCP の node のバージョンが異なっていた問題だったみたい (ごく最近までApp Engineの nodeは V.10 だったらしい)

app.yaml 内

# runtime: nodejs10
runtime: nodejs12
app.yaml 内

# runtime: nodejs10
runtime: nodejs12

これは気づいてみれば、ああ確かに 的な。