🌊

Next.js(Vercel Functions)でファイルを読み込むコツ

2024/08/02に公開
Error: ENOENT: no such file or directory, open '/var/task/path/to/your/file'

みたいなエラーにいつまでも悩まされているすべての方に捧ぐ

TL; DR

  • 読みたいファイル(を含むフォルダ)はプロジェクトルートに配置する
  • ファイルを読み込む前に、そのファイルを含むディレクトリを readdir する

(たぶん)

本編

私は元々

await readFile(resolve(process.cwd(), 'src/path/to/your/file'))

のような感じで、src 下に配置したファイルを読み込もうとして冒頭のエラーが出ていました。

GitHub のディスカッションなどを参考に、ファイル読み込みの直前に一度 readdir してみるなどしましたが no such file or directory でした。
仕方ないのでひたすらデプロイして ls したところ、src 下には pages しか残らない(正しくはビルド時に改めて生成されていると思いますが)ようでした。

公式のサンプル(How can I use files in Vercel Functions?)を見直していたところ、ルートに置いているファイルしか読んでいないことに気付き、ファイルをルートに移動しました。

ルートに hoge ディレクトリを作り src の代わりに hoge 下にファイルを配置します。

project
├── hoge <- ここ!
├── node_modules
├── public
├── src
├── README.md
├── next-env.d.ts
├── next.config.js
├── package.json
└── tsconfig.json
await nodeReaddir(resolve(process.cwd(), 'hoge'))
await readFile(resolve(process.cwd(), 'hoge/path/to/your/file'))

これでエラーが消えました。

実行時に src 下のファイルを読もうとしてエラーになっている場合は src の外に出すことを検討してみてください。

おわり

正直、なぜルートのファイルしか読めないのかはよくわかっていません。

どこか、この仕様が明記されている場所をご存じの方はご教示ください…。

2024/08/08 追記

やはり読み込み前に readdir しないといけないようです。
詳しく調査をしたらまた追記するかもしれません。

書き忘れていましたが、私の実行環境は

  • Next.js: 15.0.0-canary.102
  • Node.js: v20.9.0

なので、もしかすると安定版では readdir が不要になっている可能性も…?

GitHubで編集を提案

Discussion