PM2意外令牌导入。

12

我有一个Web服务器,当我使用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)

你的Node.js版本是什么? - Sonu Bamniya
我有同样的问题,昨天还好用,今天就不行了。我的 Nodejs 版本是 9.4.0。 附注:我注意到昨天 pm2 已更新。 - krystianj
7个回答

20

遇到了同样的问题。

pm2发布了4.2.2版本,只能与Node 10.x或更高版本一起使用,因此:

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

在我的情况下,我想坚持使用Node 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

我会解决这个问题并使您能够继续使用node 9和pm2 4.2.1。

如果您以其他方式安装了pm2,请在安装详细信息后发布,我可以推荐如何修复。


1
在 Github 上报告了问题 - https://github.com/Unitech/pm2/issues/4588#ref-commit-278d4b2 - 我看到在 pm2 的下一个版本发布后,Node 9.x 也将能够正常工作。 - krystianj

13
升级了Node(并重新安装了pm2)后,似乎pm2试图使用其保存的旧配置来运行我的服务。我所需要做的就是删除它们并重新启动。
pm2 delete <app-name>
pm2 start src/app.js --name="<app-name>"

如果您重新安装并出现错误,提示说“当前进程列表与保存的列表不同步”,则也可以使用以下方法:

pm2 resurrect

谢谢,你救了我!我将NodeJS从8.x升级到10.x并重新安装了pm2,然后执行了“pm2 resurrect”以恢复我的pm2进程,但出现了这个错误。 - Mohammed Sufyan Shaikh
如果您的运行进程未在 pm2 ls 中显示,那么您可以运行 pm2 delete all 进行清除。 - spencer.sm
谢谢,应该将此添加到已接受的答案中。 - alfianrehanusa

7

这个答案是为了处理历史系统而准备的。

正如其他人指出的那样,这个错误是由于node版本和pm2版本之间的不兼容性造成的。例如,当在一个旧项目上工作时,可能会出现这个问题,其中pm2得到更新,但是node.js的版本比较老。

即使最好的办法是升级node版本,但并不总是有可能做到这一点。 因此,如果你运行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(与您的node兼容):
$ npm install -g pm2@3.5.2 # might need sudo

您可以通过运行以下命令之一来验证程序是否成功安装:$ pm2 --version 或第一步中的命令 $ npm list -g --depth 0

提示: 确定您需要哪个版本的最佳方法可能是检查pm2更改日志并查看哪个pm2发行版更改了Node版本。


1
我遇到了以下错误:

/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与Node 8存在一些问题,我们必须将Node版本升级至至少12才能正常工作。我也这样做了,它对我起作用了。

注意: Node.js版本大多数是向后兼容的,这意味着您为Node 8编写的代码将在Node 10或12上运行。因此,如果您只有普通的JavaScript,升级应该不会遇到困难。


1

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


0
我找到的解决方法是使用Windows PowerShell运行它。 我之前用Git Bash运行时出现了相同的错误,但在PowerShell中运行后,它正确地启动了,并且包含了我想要的所有实例。

这可能意味着您在计算机上安装了2个版本的Node,并且PowerShell看到的版本与Git Bash看到的版本不同。 - aggregate1166877

-1
我有和你一样的问题,但是我解决了。我将nodejs更新到最新版本。
请执行以下三个命令:
  • sudo npm cache clean -f
  • sudo npm install -g n
  • sudo n stable
这样就可以重置它了。你的问题会得到解决。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接