Nodejs module.parent 条件在 ubuntu 服务器上不起作用

Posted

技术标签:

【中文标题】Nodejs module.parent 条件在 ubuntu 服务器上不起作用【英文标题】:Nodejs module.parent condition not working on ubuntu server 【发布时间】:2022-01-11 08:32:33 【问题描述】:

我正在处理一个现有项目,并在我的 app.js 中找到了这段代码

//if (!module.parent) 
  // Server listen
  app.listen(mysettings.port, function () 
    console.log(`Server ready at $ENV:$mysettings.port`);
  );
//

当我在本地运行时,app.listen 命中并且我的项目运行,当我将我的项目上传到 ubuntu 服务器上时,项目没有运行,而是超时。当我注释掉 ubuntu 上的条件时,项目运行完美。我知道在我的本地主机上,module.parent 为空。

如有任何帮助,将不胜感激。

【问题讨论】:

在 ubuntu 服务器上上传我的项目”是什么意思?该服务器如何执行您的脚本?以及如何在本地执行? 你了解条件的作用吗?在你的项目中它甚至是必要的吗? @Bergi 我不知道条件是什么,也不知道项目是否有必要。在本地,我会使用 npm i,然后使用 npm start...在这个 ubuntu 服务器上,我们使用的是名为 Plesk 的东西(第一次使用它),基本上你上传你的项目,然后在 Plesk 仪表板中有一个选项来启用 nodejs 和你告诉它路径在哪里以及文件被称为什么,然后是重新启动应用程序、npm 安装、运行脚本(使用构建)并运行它的选项。 关于条件的目的,请参阅here。也许问最初添加它的开发人员?至于plesk,我不知道。 你能做一个console.log(module.parent) 并在这里发布输出吗?我想知道它长什么样。 【参考方案1】:

这可能对你有用:

if ((!module.parent) || (("exports" in module.parent) && ("PhusionPassenger" in module.parent.exports))) 
  // Server listen
  app.listen(mysettings.port, function () 
    console.log(`Server ready at $ENV:$mysettings.port`);
  );

module.parentnull,当您的 app.js 直接从节点调用时,就像在 node app.js 中一样。

我相信 Plesk 在后台使用了 PhusionPassenger(至少 Plesk 官方的 node.js 扩展可能是您的情况)。在这种情况下,您的应用程序可能会使用命令passenger start --app-type node --startup-file app.js 调用,该命令会在您之前预加载脚本node-loader.js,该脚本将成为您的module.parent

如果您希望直接节点和乘客调用的行为相同,则必须将代码中的每个 (!module.parent) 过滤器替换为 (!module.parent) || (("exports" in module.parent) && ("PhusionPassenger" in module.parent.exports))。通过这样做,您将不断避免原始开发人员可能打算避免的情况。

【讨论】:

【参考方案2】:

“超时”一般表示无法绑定端口。

您可能必须修复环境才能访问所需的 ENV 值。 尝试全局设置环境(需要重新启动才能启动):

sudo nano /etc/environment

还要确保 mysettings.port 甚至可以访问/未被其他东西使用。 这个answer似乎是相关的,所以甚至可能有两种方法来定义环境。 (我的答案是 Linux 版本 - 链接的答案似乎是 Plesk 版本)。从文件加载时,仍然有可能一个具有合适的值 - 而另一个没有。

【讨论】:

【参考方案3】:

module.parent 是 Node 在你 require() 模块时设置的特殊属性。这是对需要此模块的模块的引用。 如果您是***模块,则为null。如果您是子模块,则它是父模块。如果你是孙子,那就是祖父母。以此类推。

// $ node app.js
console.log(module.parent); // `null`

// require('./app')
console.log(module.parent); // ` ... `

【讨论】:

以上是关于Nodejs module.parent 条件在 ubuntu 服务器上不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何更新/修复单个子模块的父版本

nodejs 和 async.waterfall 带有 if 条件和条件函数列表。

nodejs 和 async.waterfall 带有 if 条件和条件函数列表。

带有条件语句的 NodeJS 顺序异步

NodeJS MongoDb updateMany() 有条件?

nodeJs学习-18 mysql数据库了解