为何Next.js自定义服务器适配pages/目录却不适配app/目录?
问题:Next.js App Router应用使用自定义JS Server返回空白页面
我有两个Next.js应用,一个基于pages/目录,另一个基于app/目录。使用官方文档所述的自定义JS Server部署时,仅Pages Router的应用能正常运行,App Router的应用返回空白页面,仅输出以下内容:
<html> <head></head> <body></body> </html>
当前使用的.htaccess配置如下:
PassengerAppRoot "/home/user/frontend" PassengerBaseURI "/" PassengerNodejs "/home/user/nodevenv/frontend/16/bin/node" PassengerAppType node PassengerStartupFile server.js
解决方案
1. 升级Node.js版本
App Router要求Node.js版本≥18.17.0,你的配置中使用的是Node.js 16,存在兼容性问题。升级到18.x或20.x版本后,更新.htaccess中的Node路径:
PassengerNodejs "/home/user/nodevenv/frontend/18/bin/node"
2. 修正自定义Server代码适配App Router
App Router对自定义Server的API有要求,确保使用正确的初始化和请求处理逻辑,示例代码如下:
const { createServer } = require('http') const { parse } = require('url') const next = require('next') const dev = process.env.NODE_ENV !== 'production' const hostname = 'localhost' const port = process.env.PORT || 3000 const app = next({ dev, hostname, port }) const handle = app.getRequestHandler() app.prepare().then(() => { createServer(async (req, res) => { try { const parsedUrl = parse(req.url, true) await handle(req, res, parsedUrl) } catch (err) { console.error('处理请求出错:', req.url, err) res.statusCode = 500 res.end('内部服务器错误') } }).listen(port, (err) => { if (err) throw err console.log(`> 服务已启动:http://${hostname}:${port}`) }) })
3. 检查Passenger与构建配置
- 确保App Router应用已执行
next build生成.next目录,且该目录与server.js同属PassengerAppRoot指定的路径 - 在
.htaccess中添加环境变量声明,明确生产环境:
PassengerEnvVar NODE_ENV production
4. 排查自定义路由干扰
如果自定义Server中存在自定义路由规则,确保未匹配的请求全部交给Next.js的请求处理器处理,避免提前返回空白响应。
内容的提问来源于stack exchange,提问作者Jjkivai
相关产品推荐
相关产品推荐

