You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 12:05:18