解决 Node.js 项目报 SyntaxError: Unexpected token ... 错误
问题
我们的天猫精灵服务是用 Node.js 做的。
- 今天在该项目中添加一个包nzh,我是在package.json里面直接添加的,然后运行npm install,运行后会安装nzh包,同时也会更新其他需要更新的包。
- 然后 Debug,测试通过没有问题,接着发布到服务器上。服务器上运行 forever start xx.js,竟然 stopped。
- 看了下log,竟然报错了,测试环境没有问题,生产环境却报错了。
报错如下:
| 1 | /xxx/node_modules/mqtt/node_modules/ws/lib/websocket.js:345 | 
SyntaxError: Unexpected token ...
翻译中文为:
语法错误:意外的标记
很明显报错的为...,语法错误,这肯定是ES特性不支持的问题,不支持那就是Node.js的版本的问题
解决
- 查看服务器Node.js版本为6.9.2
- 查看测试环境Node.js版本为12.13.1
果然版本不一致,考虑到服务器的 Node.js 版本确实有点低了,决定升级到最新稳定版本
- 安装 Node.js 版本管理工具1 npm install -g n 
- 安装最新稳定版 node1 npm lts 
- 使用 n 切换版本1 
 2
 3
 4
 5
 6$ n 
 node/6.9.2
 node/10.16.3
 ο node/12.13.1
 Use up/down arrow keys to select a version, return key to install, d to delete, q to quit
- 查看Node.js版本
奇怪了,没有切换成功
通过搜索找到了原因:
n 默认安装路径是 /usr/local,若你的 node 不是在此路径下,n 切换版本就不能把bin、lib、include、share 复制该路径中,所以我们必须通过N_PREFIX变量来修改 n 的默认node安装路径。
通过 which 命令查看命令所在的路径。
which: 常用于查找可直接执行的命令。只能查找可执行文件,该命令基本只在$PATH路径中搜索,查找范围最小,查找速度快。默认只返回第一个匹配的文件路径,通过选项 -a 可以返回所有匹配结果。
具体请参考 node.js版本管理工具n无效的原理和解决方法
- 启动Node.js服务启动成功了,解决完成。1 forever start xxx.js 
思考
问题虽然是解决了。
或许你会有更多疑问了❓❓❓
- …操作符是什么?
- …操作符真的不支持 node v6.9.2 吗?
考虑到…操作符要介绍的内容较多,就不在这篇文章中写了。
请看下篇文章《JavaScript…延展操作符(Spread operator)》。
解决 Node.js 项目报 SyntaxError: Unexpected token ... 错误

