4

在我的项目中,我使用包Next.js创建了一个类似快递的route->middleware->endpoint模式。next-connect

我有这个路线模式:

/api/tours 

/api/tours/:id

/api/tours/top-5-cheap

/api/tours/stats

/api/tours/monthly-plan
...

在我的pages/api/tours/index.js文件中,我添加了一条路由来捕获 api/tours 和所有其他子路由,例如 api/tours/top-5-cheap。根据文档,这应该有效。但是只有 api/tours 可以正常工作,对 api/tours/subroute 的任何请求都会给出一个page not found error.Docs: next-connect

import nc from 'next-connect'
const mainRoute = nc({ attachParams: true })

const subRoute1 = nc().use(mid1).get((req, res) => { res.end("api/tours/top-5-cheap") });
const subRoute2 = nc().use(mid2).use(mid3).post(endpoint2);
const subRoute3 = nc().use(mid4).use(mid5).use(mid6).get((req, res) => { res.end("api/tours/monthly-plan") })
    
mainRoute
    .use("/top-5-cheap", subRoute1)
    .use("/stats", subRoute2)
    .use("/monthly-plan", subRoute3)
    .get((req, res) => { res.end("api/tours") })

export default mainRoute

我希望能够从pages/api/index.js文件中捕获对 api/tours 和 api/tours/subroute 的所有请求,而不是为每个子路由创建一个文件 欢迎提出任何建议或帮助

4

1 回答 1

3

您收到404: Page not found错误消息,因为该页面不存在。Next.JS 路由方法,意味着api/tours/top-5-cheap会去/pages/api/top-5-cheap.js. 如果它不存在,它会返回一个错误。

注意:您可以在没有next-connectNext.JS 基于文件的路由系统的包的情况下执行此操作。

没有next-connect

这是我的两个可能的解决方案

  • 创建一个新文件并将名称括在方括号 ( []) 中以使其成为dynamic route.
└── pages
    └── api
        └── tours
            ├── index.js
            └── [id].js

并使用useRouter钩子或其中一种data-fetching方法,来访问动态parameter

// pages/tours/[id].js
import { useRouter } from 'next/router';

const Post = () => {
  const router = useRouter();
  return <p>Post: {router.query.id}</p>
}
  • 您可以向基本路由发送请求并将子路由作为查询传递
www.example.com/api/tours?id=top-5-cheap

// pages/api/tours/index.js
export default function (req, res) {
  // sub-route id will be passed in params object
  const id = req.params.id // top-5-cheap; ...
  
  res.send(`Requested ${id} api page`)
}

next-connect

您不能将 Next.JS 服务器与基于文件的路由和 next-connect 包一起使用,因此您必须使用自定义服务器。

阅读官方文档Using a Custom Server

请记住,您必须按照disable the file-based routing自己的意愿工作。

// next.config.js
module.exports = {
  useFileSystemPublicRoutes: false,
}
于 2021-10-02T08:23:42.710 回答