NestJS应用启动时出现??=运算符相关语法错误求助
兄弟,我太懂你碰到这个问题的糟心了!先还原下你遇到的错误场景和日志:
[16:00:15] Starting compilation in watch mode...
[16:00:18] Found 0 errors. Watching for file changes./Users/kirill/Documents/Документы — MacBook Pro - Customer/IT/additional courses/nest.js/educ-project/node_modules/@nestjs/common/file-stream/streamable-file.js:34
this.stream ??= bufferOrReadStream;
^^^SyntaxError: Unexpected token '??='
at wrapSafe (internal/modules/cjs/loader.js:1029:16)
at Module._compile (internal/modules/cjs/loader.js:1078:27)
...(错误栈后续内容省略)
你说改源码发现其他模块也有这个表达式,其实这根本不是源码的问题——核心原因是你的Node.js版本太低,不支持ES2020引入的??=(空值合并赋值)运算符。
为什么会出现这个错误?
现在新版本的@nestjs/common已经用上了较新的ES语法,而??=这个运算符需要Node.js 14.0.0及以上版本才支持。从你错误栈里的internal/modules/cjs/loader.js版本来看,你的Node.js版本肯定低于14.0.0,所以才会把这个运算符识别成非法语法。
怎么解决?
给你两个可行方案,优先选第一个:
升级Node.js到支持的版本
这是最彻底的解决办法。推荐直接升级到Node.js的LTS长期支持版本(比如18.x或者20.x),现在NestJS官方也要求最低Node.js 16+版本。升级后记得:- 删除项目里的
node_modules文件夹和package-lock.json(或yarn.lock)文件 - 重新执行
npm install(或yarn install) - 再启动项目,这个语法错误应该就消失了
- 删除项目里的
降级@nestjs/common到兼容旧Node.js的版本
如果你暂时没法升级Node.js,只能退而求其次,把@nestjs/common降级到还没使用??=语法的旧版本(比如@nestjs/common@8.x系列的某个稳定版本)。不过这个办法不推荐,因为旧版本会缺少新功能和安全补丁,长期来看还是升级Node.js更稳妥。
另外提醒一句:别再改node_modules里的代码啦,就算你改了这一处,其他依赖包也可能用同样的新语法,而且每次执行npm install都会覆盖你改的内容,完全是白费功夫~
备注:内容来源于stack exchange,提问作者Kirilll

