让API route读取app目录下Next.js中的文件

vlju58qv  于 2023-11-18  发布在  其他
关注(0)|答案(1)|浏览(128)

我在Nextjs中的一切都很挣扎。即使是基本的东西对我来说也不起作用。这个简单的例子是一个API调用,如果输入“Me”,它会返回logged in,并且应该返回从mydata.txt读取的消息。文件读取会破坏它,如果msg是硬编码的,它就能工作!

app/api/myapi.js

var fs = require('fs');
export default function handler(req, res) {
  var msg = fs.readFileSync("mydata.txt")
  if(req.body=="Me"){ res.status(200).json({ message: `Logged in` }) }
  else{ res.status(200).json({ message: `Error ${msg}` })  } 
}

字符串
index.html中,我尝试获取响应并警告它。mydata.txt文件的行为"Not logged in"mydata.txt位于app/api目录中,我还尝试将其放在根目录中。)
错误总是:
POST https://basicapi.vercel.app/api/myapi 404(Not Found)VM 155:1 Uncaught(in promise)SyntaxError:JSON input的意外结尾
我试着把mydata.txt文件移到不同的地方。当msg被硬编码时,它就像预期的那样工作了。

drkbr07n

drkbr07n1#

你混淆了应用路由器(NextJS 13的新功能)和页面路由器。它们需要不同的样式,甚至NextJS文档也根据项目所基于的路由器类型将文档分开。
如果您使用的是页面路由器

  • 父文件夹应为page
  • 您可以继续使用当前文件,只需将路径更改为/pages/api/myapi.js

如果您使用的是应用路由器:

  • 父文件夹应为app
  • 文件名应为route.js。对于您的情况,路径应为/app/api/myapi/route.js
  • HTTP函数必须命名为HTTP动词,例如GET,POST等,每个都导出。
  • 此外,处理程序的参数不是处理程序中的标准express请求和响应。在TypeScript中,处理程序接受类型为NextRequest的对象,与express.Request不同

如果你想继续使用应用程序路由器,那么你需要更改代码。

相关问题