pm2意外的令牌导入

时间:2020-01-21 04:03:23

标签: javascript node.js pm2

我有一个在使用node或nodemon(例如“ nodemon index.js”)时可以工作的网络服务器。但是,当我尝试使用pm2(“ pm2 start index.js”)时,出现“ SyntaxError:意外的令牌导入”。完整的错误日志如下。我在这里做什么错了?

/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js:29
import(process.env.pm_exec_path);
^^^^^^

SyntaxError: Unexpected token import 
at new Script (vm.js:51:7)
at createScript (vm.js:136:10)
at Object.runInThisContext (vm.js:197:10)
at Module._compile (internal/modules/cjs/loader.js:618:28)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:665:10)
at Module.load (internal/modules/cjs/loader.js:566:32)
at tryModuleLoad (internal/modules/cjs/loader.js:506:12)
at Function.Module._load (internal/modules/cjs/loader.js:498:3)
at Function.Module.runMain (internal/modules/cjs/loader.js:695:10)
at startup (internal/bootstrap/node.js:201:19)

5 个答案:

答案 0 :(得分:10)

遇到同样的问题。

pm2发布了4.2.2版,该版本仅适用于Node 10.x或更高版本,因此:

最好的解决方案是将节点从9.x升级到10.x或更高版本。

在我的情况下,我想坚持使用节点9,因此将pm2的版本固定为4.2.1。

我使用npm在我的Dockerfile中安装pm2:

更改:

RUN npm install -g webpack@4.29.3 pm2

收件人:

RUN npm install -g webpack@4.29.3 pm2@4.2.1

将解决此问题,并允许您继续使用节点9和pm2 4.2.1

如果您以其他方式安装pm2,请发布安装详细信息,我可以建议如何修复。

答案 1 :(得分:4)

将节点升级到v12 (并重新安装pm2)之后,似乎pm2试图使用保存的旧配置来运行我的服务。我要做的就是删除并重新启动它们。

pm2 delete <app-name>
pm2 start src/app.js --name="<app-name>"

答案 2 :(得分:0)

对于最新的pm2,您需要创建一个ecosystem.config.js文件,内容类似于

module.exports = {
  apps : [{
    name: "mp-todo",
    script: "./build/index.js",
    env: {
      NODE_ENV: "development",
    },
    env_production: {
      NODE_ENV: "production",
    },
    log_date_format: 'YYYY-MM-DD HH:mm Z',
    combine_logs: true
  }]
}

您可以使用pm2 start ecosystem.config.js --env production在配置文件中使用环境变量

答案 3 :(得分:0)

我发现的解决方法是使用Windows PowerShell运行它。 我在Git Bash上运行它,但无法正常工作,上面给出了相同的错误。 使用PowerShell运行后,它可以正确启动,并包含我想要的所有实例。

答案 4 :(得分:0)

此答案用于处理遗留系统

正如其他人指出的,该错误是节点版本和 pm2 版本之间不兼容的产物。例如,在处理旧项目时可能会导致此问题,其中 pm2 已更新但 node.js 版本较旧。

“只升级节点版本”并不总是可能的,即使这是最好的做法。因此,如果您运行 pm2 并且它会给您一个错误,例如:

$ pm2 --version

/usr/local/nvm/v6.3.0/lib/node_modules/pm2/node_modules/chalk/source/index.js:103
  ...styles,
  ^^^
SyntaxError: Unexpected token ...
    at Object.exports.runInThisContext (vm.js:76:16)
    at Module._compile (module.js:513:28)
    at Object.Module._extensions..js (module.js:550:10)
    at Module.load (module.js:458:32)
    at tryModuleLoad (module.js:417:12)
    at Function.Module._load (module.js:409:3)
    at Module.require (module.js:468:17)
    at require (internal/module.js:20:19)
    at Object.<anonymous> (/usr/local/nvm/v6.3.0/lib/node_modules/pm2/constants.js:10:14)
    at Module._compile (module.js:541:32)

您现在可以先解决问题,然后再计划升级。

  1. 您可以使用以下命令获取当前安装的 npm 软件包版本,其中还包含您的 pm2 软件包及其版本:
$ npm list -g --depth 0

/usr/local/lib
├── other-package@version.number
└── pm2@4.2.2
├── ...
└── ...

  1. 然后在检查它是与版本控制相关的问题后,只需降级 pm2 即可通过全局安装特定版本的 pm2(与您的节点兼容)来使其恢复工作:
$ npm install -g pm2@3.5.2 # might need sudo

您可以通过运行 $ pm2 --version 或第一步中的命令 $ npm list -g --depth 0

来验证安装是否成功

提示:确定您需要哪个版本的最佳方法可能是检查 pm2 changelogs 并查看哪个 pm2 版本已更改节点版本。