解决 Node.js 项目报 SyntaxError: Unexpected token ... 错误

问题

我们的天猫精灵服务是用 Node.js 做的。

  1. 今天在该项目中添加一个包nzh,我是在 package.json 里面直接添加的,然后运行 npm install,运行后会安装nzh包,同时也会更新其他需要更新的包
  2. 然后 Debug,测试通过没有问题,接着发布到服务器上。服务器上运行 forever start xx.js,竟然 stopped。
  3. 看了下log,竟然报错了,测试环境没有问题,生产环境却报错了。

报错如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/xxx/node_modules/mqtt/node_modules/ws/lib/websocket.js:345
...options
^^^
SyntaxError: Unexpected token ...
at Object.exports.runInThisContext (vm.js:76:16)
at Module._compile (module.js:542:28)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.require (module.js:497:17)
at require (internal/module.js:20:19)
at Object.<anonymous> (/xxx/node_modules/mqtt/node_modules/ws/index.js:3:19)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.require (module.js:497:17)
at require (internal/module.js:20:19)

SyntaxError: Unexpected token ...
翻译中文为:
语法错误:意外的标记

很明显报错的为...,语法错误,这肯定是ES特性不支持的问题,不支持那就是Node.js的版本的问题

解决

  • 查看服务器Node.js版本为6.9.2
  • 查看测试环境Node.js版本为12.13.1

果然版本不一致,考虑到服务器的 Node.js 版本确实有点低了,决定升级到最新稳定版本

  1. 安装 Node.js 版本管理工具
    1
    npm install -g n
  2. 安装最新稳定版 node
    1
    npm lts
  3. 使用 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
  4. 查看Node.js版本

奇怪了,没有切换成功
通过搜索找到了原因:

n 默认安装路径是 /usr/local,若你的 node 不是在此路径下,n 切换版本就不能把bin、lib、include、share 复制该路径中,所以我们必须通过N_PREFIX变量来修改 n 的默认node安装路径。

通过 which 命令查看命令所在的路径。

which: 常用于查找可直接执行的命令。只能查找可执行文件,该命令基本只在$PATH路径中搜索,查找范围最小,查找速度快。默认只返回第一个匹配的文件路径,通过选项 -a 可以返回所有匹配结果。

具体请参考 node.js版本管理工具n无效的原理和解决方法

  1. 启动Node.js服务
    1
    forever start xxx.js
    启动成功了,解决完成。

思考

问题虽然是解决了。
或许你会有更多疑问了❓❓❓

  • …操作符是什么?
  • …操作符真的不支持 node v6.9.2 吗?

考虑到…操作符要介绍的内容较多,就不在这篇文章中写了。
请看下篇文章《JavaScript…延展操作符(Spread operator)》。

解决 Node.js 项目报 SyntaxError: Unexpected token ... 错误

https://ganzhixiong.com/p/c19f3473/

Author

干志雄

Posted on

2021-10-02

Updated on

2021-10-02

Licensed under

Comments