Node.js部署Cloud Foundry报错:Array.includes is not a function求助
问题原因与解决办法
这个问题我之前帮同行排查过,核心原因很明确:你本地用的Node.js版本支持ES2016的Array.prototype.includes()方法,但Cloud Foundry环境里的Node.js版本太低,不支持这个特性。
具体说下为啥会这样:
includes是ES2016(也就是常说的ES7)引入的数组方法,Node.js从6.0.0版本开始才原生支持它;- 你本地的Node版本肯定是6.0.0以上的,所以代码跑起来没问题;但Cloud Foundry默认分配的Node版本可能低于6.0.0,或者环境配置里没开启对这个新特性的支持,导致
fs.readdirSync返回的数组对象上根本没有includes这个方法,自然就抛出报错了。
给你三个可行的解决方向:
换成兼容老版本的写法(最快修复)
直接用ES3就支持的indexOf替代includes,逻辑完全一致,兼容性拉满:var fs = require('fs'); var data = fs.readdirSync("<directory>"); if(data.indexOf('a') !== -1){ console.log('value found!'); }指定Cloud Foundry使用高版本Node
在项目根目录添加一个package.json,明确指定Node版本(比如选14.x这种稳定版),Cloud Foundry会自动按这个版本部署:{ "engines": { "node": "14.x" } }这样部署后,环境里的Node就支持
includes了,原代码不用改就能正常运行。加Polyfill兼容旧环境
如果因为某些限制没法升级Node版本,可以在代码最开头加一段Polyfill,手动给数组添上includes方法:// 兼容不支持includes的旧Node版本 if (!Array.prototype.includes) { Array.prototype.includes = function(searchElement, fromIndex) { fromIndex = fromIndex || 0; return this.indexOf(searchElement, fromIndex) !== -1; }; } // 你的原有代码 var fs = require('fs'); var data = fs.readdirSync("<directory>"); if(data.includes('a')){ console.log('value found!'); }
内容的提问来源于stack exchange,提问作者Jatin S Bhavra
相关产品推荐
相关产品推荐

