PM2中无法开启ES6的解决方案

555 查看

背景

用于项目中使用了阿里云的OSS功能,而阿里官方的Node.js类库(ali-oss)是基于ES6写的,因此应用需要在ES6环境下运行。

Node

在本地(MBP)上,通过修改package.json文件中的script来更改环境,代码如下:

  "scripts": {
    "start": "node --harmony server.js"
  },

添加--harmony后,通过nodemon运行没有问题。

PM2

将应用通过PM2部署到阿里云的ECS(CentOS)中的时候,一直报错。提示无法正确运行,错误显示如下:

tegaoya-1 (err): /home/eee/www/tegaoya/production/source/node_modules/ali-oss/lib/client.js:295
tegaoya-1 (err): proto.request = function* (params) {
tegaoya-1 (err):                         ^
tegaoya-1 (err): SyntaxError: Unexpected token *
tegaoya-1 (err):     at Module._compile (module.js:439:25)
tegaoya-1 (err):     at Object.Module._extensions..js (module.js:474:10)
tegaoya-1 (err):     at Module.load (module.js:356:32)
tegaoya-1 (err):     at Function.Module._load (module.js:312:12)
tegaoya-1 (err):     at Function._load (/usr/lib/node_modules/pm2/node_modules/pmx/lib/transaction.js:62:21)
tegaoya-1 (err):     at Module.require (module.js:364:17)
tegaoya-1 (err):     at require (module.js:380:17)
tegaoya-1 (err):     at Object.<anonymous> (/home/eee/www/tegaoya/production/source/libs/AliOssStorage.js:4:11)
tegaoya-1 (err):     at Module._compile (module.js:456:26)
tegaoya-1 (err):     at Object.Module._extensions..js (module.js:474:10)
tegaoya-1 (err):     at Module.load (module.js:356:32)
tegaoya-1 (err):     at Function.Module._load (module.js:312:12)
tegaoya-1 (err):     at Function._load (/usr/lib/node_modules/pm2/node_modules/pmx/lib/transaction.js:62:21)
tegaoya-1 (err):     at Module.require (module.js:364:17)
tegaoya-1 (err):     at require (module.js:380:17)
tegaoya-1 (err):     at Object.<anonymous> (/home/eee/www/tegaoya/production/source/app_server/controllers/upload.js:3:21)

给PM2添加ES6的支持

通过Google,发现给PM2配置ES6支持的方法如下:

命令行

命令行中添加--node-args="--harmony"即可让应用以ES6运行:

$ pm2 start my_app.js --node-args="--harmony"

配置文件

在配置文件(ecosystem.json)中,添加node_args属性来添加ES6的支持:

[{
  "name" : "ES6",
  "script" : "es6.js",
  "node_args" : "--harmony"
}]

问题

但是,在按照以上配置操作后,依然无法启用ES6的支持,还是报错。在查看node的版本后,发现了问题所在:

$ node -v
v0.10.*

好吧,看来是CentOS系统中yum自带的node版本不支持ES6,于是着手升级:

卸载node

通过命令:

$ yum remove nodejs

卸载老版本的nodejs

安装新版本

按照官方的文档,通过如下命令安装4.*的LTS版本(root下):

curl --silent --location https://rpm.nodesource.com/setup_4.x | bash -
yum -y install nodejs

安装结束后,确认版本:

$ node -v
v4.4.4

尝试

再次尝试通过PM2部署,提示成功,通过pm2 logs查看日志,没有报错。问题解决!