🌊
Next.js(Vercel Functions)でファイルを読み込むコツ
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
が不要になっている可能性も…?
Discussion