Next.js自定义服务器修改后执行yarn dev无变更,路由未触发求助
Next.js自定义服务器不生效的解决方案
核心问题1:dev脚本没运行自定义服务器
你当前的dev脚本用的是next dev,这是启动Next.js默认内置服务器的命令,完全没用到你写的Express自定义服务器文件。
修改package.json里的dev脚本,改成直接运行你的自定义服务器文件(假设你的自定义服务器文件叫server.js):
"dev": "cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 node server.js"
核心问题2:路由顺序错误
Express路由是按定义顺序匹配的,你把*(匹配所有请求)放在最前面,后面的/和/getFile永远不会被触发——请求会先被*路由拦截。要把通配路由移到最后。
核心问题3:缺少端口监听与Next.js默认请求处理
你的代码里没有让服务器监听端口,也没在通配路由里调用Next.js的请求处理逻辑,导致请求无法正常响应,日志也出不来。
修改后的完整自定义服务器代码示例:
const express = require('express'); const next = require('next'); const dev = process.env.NODE_ENV !== 'production'; const app = next({ dev }); const handle = app.getRequestHandler(); app.prepare().then(() => { const server = express(); // 先定义具体路由 server.get(`/`, (req, res) => { console.log("Test empty"); // 可在这里处理自定义逻辑,或交给Next.js渲染页面 return handle(req, res); }); server.get(`/getFile`, (req, res) => { console.log("Test file url empty"); // 自定义逻辑示例:返回内容 res.send('File content'); }); // 最后定义通配路由,处理所有其他请求 server.get(`*`, (req, res) => { console.log("Test"); return handle(req, res); // 交给Next.js处理默认路由 }); // 监听端口 server.listen(3000, (err) => { if (err) throw err; console.log('> Ready on http://localhost:3000'); }); });
验证步骤
- 保存修改后的自定义服务器文件和
package.json - 停止当前运行的
yarn dev,重新执行yarn dev - 访问
http://localhost:3000,终端会输出Test empty - 访问
http://localhost:3000/getFile,终端会输出Test file url empty - 访问其他任意路径,终端会输出
Test
内容的提问来源于stack exchange,提问作者Lokesh
相关产品推荐
相关产品推荐

