在 Vercel 上部署的 NextJS 的 API 路由上使用文件系统

JMR*_*Dev 6 api fs node.js next.js vercel

我需要在 NextJS 中的 API 路由上使用 fileStystem 方法作为 readdirSync。它在本地工作,但部署在 Vercel 上时,请求会以 500 状态代码进行响应。

\n

这是 Vercel 的功能日志:

\n
catch Error: ENOENT: no such file or directory, scandir \'/var/task/_posts\'\n    at Object.readdirSync (fs.js:1043:3)\n    at getAllArticles (/var/task/.next/server/chunks/230.js:135:67)\n    at __WEBPACK_DEFAULT_EXPORT__ (/var/task/.next/server/pages/api/search.js:37:93)\n    at Object.apiResolver (/var/task/node_modules/next/dist/server/api-utils.js:101:15)\n    at processTicksAndRejections (internal/process/task_queues.js:95:5)\n    at async Server.handleApiRequest (/var/task/node_modules/next/dist/server/next-server.js:770:9)\n    at async Object.fn (/var/task/node_modules/next/dist/server/next-server.js:661:37)\n    at async Router.execute (/var/task/node_modules/next/dist/server/router.js:205:32)\n    at async Server.run (/var/task/node_modules/next/dist/server/next-server.js:841:29)\n    at async Server.handleRequest (/var/task/node_modules/next/dist/server/next-server.js:292:20) {\n  errno: -2,\n  syscall: \'scandir\',\n  code: \'ENOENT\',\n  path: \'/var/task/_posts\'\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这是 API 路由本身 (/pages/api/search.ts):

\n
catch Error: ENOENT: no such file or directory, scandir \'/var/task/_posts\'\n    at Object.readdirSync (fs.js:1043:3)\n    at getAllArticles (/var/task/.next/server/chunks/230.js:135:67)\n    at __WEBPACK_DEFAULT_EXPORT__ (/var/task/.next/server/pages/api/search.js:37:93)\n    at Object.apiResolver (/var/task/node_modules/next/dist/server/api-utils.js:101:15)\n    at processTicksAndRejections (internal/process/task_queues.js:95:5)\n    at async Server.handleApiRequest (/var/task/node_modules/next/dist/server/next-server.js:770:9)\n    at async Object.fn (/var/task/node_modules/next/dist/server/next-server.js:661:37)\n    at async Router.execute (/var/task/node_modules/next/dist/server/router.js:205:32)\n    at async Server.run (/var/task/node_modules/next/dist/server/next-server.js:841:29)\n    at async Server.handleRequest (/var/task/node_modules/next/dist/server/next-server.js:292:20) {\n  errno: -2,\n  syscall: \'scandir\',\n  code: \'ENOENT\',\n  path: \'/var/task/_posts\'\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这是getAllArticles()其中使用的函数:

\n
export default (req: NextApiRequest, res: NextApiResponse) => {\n  const { query } = req;\n\n  try {\n    if (query.q) {\n      const posts = getAllArticles(ArticleTypes.POSTS, [\'slug\', \'href\', \'title\', \'category\'], {\n        hints: {\n          hint: query.q as string,\n          fields: [\'title\', \'category\'],\n        },\n      }).map((post) => post.data);\n\n      const projects = getAllArticles(ArticleTypes.PROJECTS, [\'slug\', \'href\', \'title\', \'category\', \'technologies\'], {\n        hints: {\n          hint: query.q as string,\n          fields: [\'title\', \'category\', \'technologies\'],\n        },\n      }).map((project) => project.data);\n\n      res.status(200).json({\n        ...(posts.length > 0) && { posts },\n        ...(projects.length > 0) && { projects },\n      });\n    } else {\n      res.status(422).send(\'El par\xc3\xa1metro "q" es necesario.\');\n    }\n  } catch (e) {\n    res.status(500).send(\'Ha ocurrido un error mientras se intentaba hacer la b\xc3\xbasqueda.\');\n  }\n};\n
Run Code Online (Sandbox Code Playgroud)\n

所以我目前正在使用它fs.readdirSync来读取 .mdx 文件。正如我之前指出的,它在本地运行得很好,但在部署到 Vercel 上时就不行了。我需要配置任何类型的配置文件或其他内容吗?

\n

太感谢了!

\n