Nodejs Ubuntu 安装 pm2 报错求解释

Nodejs Ubuntu 安装 pm2 报错求解释

楼主的代码没标记, 我给标记了… Markdown 啊… 提示错误的 exists 方法不存在, 两种可能, 1, 低版本的 Node 没有这个方法… 看上边可能是 0.10 , 应该不会啊 2, 要么是 fs 对象被什么覆盖了, 检查下对象是不是对的? 另外 pm2 start 不是应该加参数再跑的么?

9 回复

Nodejs Ubuntu 安装 pm2 报错求解释

问题描述

在Ubuntu系统中安装PM2时遇到报错,提示exists方法不存在。以下是具体的错误信息:

ReferenceError: exists is not defined
    at Object.<anonymous> (/path/to/script.js:5:10)
    ...

分析与解决方案

  1. 检查Node.js版本 首先确认你使用的Node.js版本是否支持exists方法。exists方法在Node.js 0.10版本之前已经存在,但在Node.js 0.12及更高版本中已经被废弃,推荐使用fs.existsSync()

    node -v
    

    如果你的Node.js版本高于0.12,可以尝试修改你的代码,将exists替换为fs.existsSync()

    const fs = require('fs');
    
    if (fs.existsSync('/path/to/file')) {
        console.log('File exists');
    } else {
        console.log('File does not exist');
    }
    
  2. 检查fs模块是否被覆盖 确保你在代码中没有意外地覆盖了fs模块。检查是否有其他地方定义了一个名为fs的变量或函数。

    // 假设你的代码中有以下内容
    var fs = "some string"; // 这会覆盖全局的fs模块
    
    // 修改为
    const fs = require('fs');
    
  3. 正确使用PM2 pm2 start命令需要指定一个文件路径或应用名作为参数。确保你在启动PM2时指定了正确的参数。

    pm2 start app.js
    

    或者,如果你有一个JSON配置文件(例如ecosystem.config.js),你可以直接使用它来启动应用:

    pm2 start ecosystem.config.js
    

总结

以上是针对在Ubuntu系统中安装PM2时遇到的exists方法不存在问题的分析与解决办法。确保你使用的是正确的Node.js版本,并且没有意外地覆盖fs模块。同时,在使用PM2时确保正确地指定了应用的入口文件或配置文件。


pm2 -V 表示你以及装上pm2了

cd到你要启动脚本的文件夹,

pm2 start xxx.js 就好了

pm2 start 后边应该跟上 需要执行的脚本哈

现在pm2 -v -start都报这个错蛋疼。

pm2 0.7.8 源码也就是这里: https://github.com/Unitech/pm2/blob/0.7.8/bin/pm2#L383 对应楼主的这里 /usr/local/lib/node_modules/pm2/bin/pm2:383 打开文件, 在这一行之前插入下面的代码看看结果怎么样吧:

console.log(Object.keys(fs), process.version)

[ ‘Stats’, ‘readFile’, ‘readFileSync’, ‘close’, ‘closeSync’, ‘open’, ‘openSync’, ‘read’, ‘readSync’, ‘write’, ‘writeSync’, ‘rename’, ‘renameSync’, ‘truncate’, ‘truncateSync’, ‘rmdir’, ‘rmdirSync’, ‘fdatasync’, ‘fdatasyncSync’, ‘fsync’, ‘fsyncSync’, ‘mkdir’, ‘mkdirSync’, ‘sendfile’, ‘sendfileSync’, ‘readdir’, ‘readdirSync’, ‘fstat’, ‘lstat’, ‘stat’, ‘fstatSync’, ‘lstatSync’, ‘statSync’, ‘readlink’, ‘readlinkSync’, ‘symlink’, ‘symlinkSync’, ‘link’, ‘linkSync’, ‘unlink’, ‘unlinkSync’, ‘fchmod’, ‘fchmodSync’, ‘chmod’, ‘chmodSync’, ‘fchown’, ‘fchownSync’, ‘chown’, ‘chownSync’, ’_toUnixTimestamp’, ‘utimes’, ‘utimesSync’, ‘futimes’, ‘futimesSync’, ‘writeFile’, ‘writeFileSync’, ‘watch’, ‘watchFile’, ‘unwatchFile’, ‘realpathSync’, ‘realpath’, ‘createReadStream’, ‘ReadStream’, ‘FileReadStream’, ‘createWriteStream’, ‘WriteStream’, ‘FileWriteStream’, ‘SyncWriteStream’ ] ‘v0.6.19’

ubuntu server会有这个问题,解决的方式是这样的,你先用npm install pm2在当前文件夹中,然后将这个文件夹移动到全局的文件夹里面,然后修改文件夹的权限就可以了。

我用ubuntu不是server版本的按照你的方式还是不行

根据你的描述,你在Ubuntu上安装并使用pm2时遇到了一个错误。错误信息指出exists方法不存在。这里有几个可能的原因及解决方法:

可能原因

  1. Node.js 版本过低

    • fs.exists方法在Node.js 14.14.0版本之后已经被废弃,并在某些版本中被移除。
    • 如果你使用的Node.js版本较低,可能会遇到这个问题。
  2. 命名冲突

    • 可能是由于某个地方错误地覆盖了fs模块中的exists方法。
    • 需要检查是否有其他代码或第三方库重命名或修改了fs模块。
  3. 使用方式不正确

    • pm2 start命令需要指定具体的文件路径或应用名称作为参数。

解决方案

检查Node.js版本

确保你的Node.js版本是最新的稳定版(推荐至少16.x或更高)。

node -v

如果版本低于建议的版本,可以使用nvm(Node Version Manager)来升级Node.js:

# 安装nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash

# 使用nvm安装最新稳定版Node.js
nvm install --lts

替换fs.exists

如果你的代码中仍然使用了fs.exists,推荐替换为fs.existsSyncfs.promises.access,后者支持异步操作。

const fs = require('fs').promises;

async function checkFileExists(filePath) {
    try {
        await fs.access(filePath);
        console.log(`文件存在: ${filePath}`);
    } catch (error) {
        console.error(`文件不存在: ${filePath}`);
    }
}

正确使用pm2 start

确保在使用pm2 start时指定了正确的参数,如应用的入口文件名。

pm2 start app.js

如果你提供具体的错误信息或相关代码片段,我可以进一步帮助分析问题。

回到顶部