Node.js应用部署至Heroku失败,遇TypeError: Cannot assign to read only property 'map' of object '#<QueryCursor>'错误求助
解决Heroku部署Node.js应用时的
TypeError: Cannot assign to read only property 'map' of object '#<QueryCursor>'错误 根据你提供的Heroku日志和代码,这个问题的核心是Node.js版本与Mongoose版本不兼容导致的。具体来说,你使用的Node.js v17.5.0对内置对象原型的修改做了更严格的限制,而你项目中的Mongoose版本还在尝试直接修改QueryCursor.prototype.map这个只读属性,从而触发了错误。
问题分析
从日志里的关键错误信息可以明确定位问题:
TypeError: Cannot assign to read only property 'map' of object '#<QueryCursor>' at Object.<anonymous> (/app/node_modules/mongoose/lib/cursor/QueryCursor.js:144:27)
这是因为Node.js v17升级了V8引擎,强化了对内置类原型属性的保护机制,不允许直接修改这些只读属性;而旧版本的Mongoose(通常是6.2.0之前的版本)仍在使用这种方式扩展QueryCursor的功能,两者冲突导致报错。
解决方案
你可以通过以下两种方式解决这个问题,任选其一即可:
方案1:降级Node.js到LTS版本
Node.js的LTS(长期支持)版本兼容性更强,推荐使用v16.x或v14.x版本。你可以通过以下步骤指定Heroku使用的Node.js版本:
- 在项目根目录的
package.json中添加engines字段:
"engines": { "node": "16.x" }
- 提交修改后的
package.json到Git仓库 - 重新部署到Heroku:
git push heroku main
方案2:升级Mongoose到兼容版本
Mongoose从v6.2.0开始修复了这个兼容性问题,不再直接修改只读的原型属性。你可以通过以下命令升级:
npm install mongoose@latest
或者指定具体的兼容版本:
npm install mongoose@6.2.0
升级完成后,提交package.json和package-lock.json到Git仓库,再重新部署到Heroku即可。
额外验证建议
在本地环境可以先测试修改后的代码,确保没有问题再部署:
- 如果选择降级Node.js,使用nvm切换版本:
nvm use 16,然后运行npm start - 如果选择升级Mongoose,直接运行
npm start,确认本地启动正常后再推送部署
内容的提问来源于stack exchange,提问作者Saurabh Mhaske
相关产品推荐
相关产品推荐

