在Next.js中使用Express报错:原型读取失败及async_hooks模块缺失
核心问题原因
你使用的Node.js 4.19.0版本过于陈旧,async_hooks是Node.js 8.x及以后版本才新增的核心模块,而Express 4.18.2依赖的on-finished、raw-body等包已经用到了这个模块,因此会出现找不到模块的错误,进而引发TypeError: Cannot read properties of undefined (reading 'prototype')这类连锁问题。
具体解决方案
升级Node.js版本(最关键)
卸载当前的Node.js 4.x版本,前往官网下载安装Node.js 16.x及以上的LTS版本(Next.js 13+推荐使用18.x或更高版本)。安装完成后,执行node -v和npm -v命令确认版本更新成功。清理并重新安装依赖
删除项目目录下的node_modules文件夹和package-lock.json文件,然后重新执行npm install,确保所有依赖适配新的Node.js版本。解决npm全局安装权限问题
运行npm install -g npm@latest提示权限不足时,Windows用户可右键以管理员身份打开终端再执行命令;也可以使用nvm(Node版本管理器)来管理版本,安装nvm后,通过nvm install <目标版本>安装指定Node版本,nvm use <版本号>切换使用,能有效避开权限问题。确认Next.js集成Express的正确方式
在Next.js中使用Express需要创建单独的服务器文件(比如server.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('/custom', (req, res) => { return app.render(req, res, '/custom-page', req.query); }); server.all('*', (req, res) => { return handle(req, res); }); server.listen(3000, (err) => { if (err) throw err; console.log('> Ready on http://localhost:3000'); }); });同时修改
package.json中的启动脚本:"scripts": { "dev": "node server.js", "build": "next build", "start": "NODE_ENV=production node server.js" }
内容的提问来源于stack exchange,提问作者user19438046

