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.parent
是 null
,当您的 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 条件和条件函数列表。