pm2 意外的令牌导入

pm2 Unexpected token import

我有一个在我使用 node 或 nodemon 时可以工作的网络服务器(例如 "nodemon index.js")。但是,当我尝试使用 pm2 ("pm2 start index.js") 时,我得到 "SyntaxError: Unexpected token import"。完整的错误日志如下。我在这里做错了什么?

/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)

遇到同样的问题。

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 post 您的安装详细信息,我可以推荐如何修复。

最新的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来使用配置文件中的环境变量

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

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

我找到的解决方法是 运行 它与 Windows PowerShell。 我用 运行 和 Git Bash 连接它,但它不工作,给出了上面相同的错误。 在 运行 PowerShell 之后,它正确启动,包含我想要的所有实例。

此答案适用于处理遗留系统

正如其他人所指出的,该错误是节点版本与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

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

来验证安装是否成功

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

我有以下错误:

/root/.nvm/versions/node/v8.0.0/lib/node_modules/pm2/node_modules/chalk/source/index.js:103
    ...styles,
    ^^^ SyntaxError: Unexpected token ...
at createScript (vm.js:74:10)
at Object.runInThisContext (vm.js:116:10)
at Module._compile (module.js:533:28)
at Object.Module._extensions..js (module.js:580:10)
at Module.load (module.js:503:32)
at tryModuleLoad (module.js:466:12)
at Function.Module._load (module.js:458:3)
at Module.require (module.js:513:17)
at require (internal/module.js:11:18)
at Object.<anonymous> (/root/.nvm/versions/node/v8.0.0/lib/node_modules/pm2/constants.js:10:14)

pm2 支持的版本 4.1.2 与节点版本 8 存在一些问题,我们必须将节点版本至少升级到 12 才能正常工作。我做了同样的事情,它对我有用。

注:节点。 Node.js 版本大多向后兼容,这意味着您为 Node 8 编写的代码可以在 Node 10 或 12 上运行。因此,如果您只有普通的旧 JavaScript,升级

应该没有困难

我遇到了和你一样的问题,但我已经解决了。我将 nodejs 更新到最新版本。 请输入这 3 个命令:

  • sudo npm 缓存清理 -f
  • sudo npm install -g n
  • sudo n 稳定

所以重置它。您的问题将得到解决