Node.js+Express部署Cpanel报错:Object.fromEntries is not a function
Node.js部署到Cpanel(Node 14.20.1)出现
Object.fromEntries is not a function报错排查 问题概述
本地运行正常的Node.js应用,部署到运行Node 14.20.1的Cpanel服务器时触发Object.fromEntries is not a function报错,栈追踪指向/home/joshgncd/riverbank.app/auth/index.js:435:5,但对应路由处理函数未直接调用该方法;替换Notion API请求为Axios后,报错依旧。
报错栈追踪:
at app.post (/home/joshgncd/riverbank.app/auth/index.js:435:5) at Layer.handle [as handle_request] (/home/joshgncd/nodevenv/riverbank.app/auth/14/lib/node_modules/express/lib/router/layer.js:95:5) at next (/home/joshgncd/nodevenv/riverbank.app/auth/14/lib/node_modules/express/lib/router/route.js:144:13) at Route.dispatch (/home/joshgncd/nodevenv/riverbank.app/auth/14/lib/node_modules/express/lib/router/route.js:114:3) at Layer.handle [as handle_request] (/home/joshgncd/nodevenv/riverbank.app/auth/14/lib/node_modules/express/lib/router/layer.js:95:5) at /home/joshgncd/nodevenv/riverbank.app/auth/14/lib/node_modules/express/lib/router/index.js:284:15 at Function.process_params (/home/joshgncd/nodevenv/riverbank.app/auth/14/lib/node_modules/express/lib/router/index.js:346:12) at next (/home/joshgncd/nodevenv/riverbank.app/auth/14/lib/node_modules/express/lib/router/index.js:280:10) at cors (/home/joshgncd/nodevenv/riverbank.app/auth/14/lib/node_modules/cors/lib/index.js:188:7)
触发报错的路由代码:
app.post('/auth/notion/action', async (req, res) => { try { const data = req.body const tokens = users[req.query.email].notion_tokens const notion = new Notion({ auth: tokens.access_token }) let response = await notion.search(data) res.send(response) } catch (err) { console.trace(err.message) res.status(400).send(err.message) } })
排查方向与解决方案
1. 确认实际运行的Node.js版本
Cpanel的nodevenv可能存在版本切换不彻底的情况,登录Cpanel终端执行:
node -v
验证实际运行应用的Node版本是否为14.20.1。若版本低于12.0.0(Object.fromEntries从Node 12.0.0开始支持),需切换到正确的版本环境。
2. 检查依赖包兼容性
报错栈追踪最后指向cors中间件,需检查express、body-parser、cors等核心依赖的版本,确认其是否兼容Node 14.20.1:
- 查看
package.json中的依赖版本,若存在较新版本的依赖,可能内置了仅支持更高Node版本的API调用。 - 降级依赖到兼容Node 14的稳定版本,例如:
npm install express@4.18.2 cors@2.8.5 body-parser@1.20.2
3. 添加Object.fromEntries Polyfill
若确认Node版本为14.20.1但仍出现兼容性问题,可在应用入口文件(如index.js)顶部添加Polyfill,手动实现该方法:
if (!Object.fromEntries) { Object.fromEntries = function(entries) { return entries.reduce(function(obj, [key, value]) { obj[key] = value; return obj; }, {}); }; }
4. 排查隐式调用场景
- 检查
req.body解析逻辑:若使用express.json()或body-parser,某些版本可能在解析请求体时隐式调用Object.fromEntries,需确认解析中间件的配置与版本。 - 检查
users对象构建过程:确认users对象是否通过Object.fromEntries生成,或在访问users[req.query.email].notion_tokens时触发了相关调用。
内容的提问来源于stack exchange,提问作者Joshua Reinier
相关产品推荐
相关产品推荐

