在Next.js中自定义Koa.js服务器后API请求404问题求助
问题解决:Next.js自定义Koa服务器API请求404
你的问题出在两个关键地方:
1. Koa路由中间件顺序错误
你把router.allowedMethods()放在了router.routes()之前,这会导致路由匹配逻辑还未执行,allowedMethods无法正确识别请求是否匹配到路由,同时可能干扰正常的路由处理流程。正确顺序是先注册路由处理,再注册方法校验中间件。
2. 可能的路由路径/方法不匹配
需要确认UserRouter中定义的路由路径(比如是否是/api/login而非/login)和HTTP方法(比如POST请求是否对应了router.post)与你的请求完全一致。
修正后的server.js代码
import '@babel/polyfill'; import dotenv from 'dotenv'; import 'isomorphic-fetch'; import next from 'next'; import Koa from 'koa'; import Router from 'koa-router'; import UserRouter from './routes/user'; import cors from '@koa/cors'; dotenv.config(); const compression = require('compression'); const port = parseInt(process.env.PORT, 10) || 3000; const dev = process.env.NODE_ENV !== 'production'; const app = next({ dev }); const handle = app.getRequestHandler(); app.prepare().then(() => { const server = new Koa(); const router = new Router(); // CORS中间件 server.use( cors({ origin: '*', }) ); // 先注册API路由(UserRouter) server.use(UserRouter.routes()).use(UserRouter.allowedMethods()); // 再注册Next.js的默认路由处理 router.get('*', async (ctx) => { await handle(ctx.req, ctx.res); ctx.respond = false; }); // 修正顺序:先路由处理,再方法校验 server.use(router.routes()).use(router.allowedMethods()); server.listen(port, (err) => { if (err) throw err; console.log(`Server ready on ${port}`); }); });
额外检查项
- 打开
./routes/user.js,确认路由定义类似:const Router = require('koa-router'); const router = new Router({ prefix: '/api' }); // 确保有/api前缀,或者路径直接写/api/login router.post('/login', async (ctx) => { // 你的登录逻辑 ctx.body = { success: true }; }); module.exports = router; - 确认请求的HTTP方法(POST/GET)与路由定义的方法一致。
内容的提问来源于stack exchange,提问作者LosMos
相关产品推荐
相关产品推荐

