【应用服务 App Service】NodeJS +Egg 发布到App Service时遇见 [ERR_SYSTEM_ERROR]: A system error occurred:uv_os_get_passwd returned ENOENT(no such file or directory)
问题情形
本地NodeJS应用使用Egg脚手架构建,本地运行测试完全没有问题,发布后App Service后不能运行。通过登录到kudu后(https://<your web site>.scm.chinacloudsites.cn)后,在日志中发现找不到一个文件或路径的错误。通过在kudu的CMD窗口执行npm start命令,发现错误是一致,怀疑是对Egg中某个框架的不支持。
详细日志
Application has thrown an uncaught exception and is terminated: SystemError [ERR_SYSTEM_ERROR]: A system error occurred: uv_os_get_passwd returned ENOENT (no such file or directory) at Object.userInfo (os.js:272:11) at module.exports (D:\home\site\wwwroot\pynode\node_modules\node-homedir\index.js:10:26) at AppWorkerLoader.getHomedir (D:\home\site\wwwroot\pynode\node_modules\egg-core\lib\loader\egg_loader.js:163:36) at AppWorkerLoader.getAppInfo (D:\home\site\wwwroot\pynode\node_modules\egg-core\lib\loader\egg_loader.js:174:23) at new EggLoader (D:\home\site\wwwroot\pynode\node_modules\egg-core\lib\loader\egg_loader.js:87:25) at new AppWorkerLoader (D:\home\site\wwwroot\pynode\node_modules\egg\lib\loader\app_worker_loader.js:9:1) at new EggCore (D:\home\site\wwwroot\pynode\node_modules\egg-core\lib\egg.js:118:19) at new EggApplication (D:\home\site\wwwroot\pynode\node_modules\egg\lib\egg.js:43:5) at new Application (D:\home\site\wwwroot\pynode\node_modules\egg\lib\application.js:60:5) at Object.<anonymous> (D:\home\site\wwwroot\pynode\index.js:3:13) |
在详细的log文件中,可以看见全面的错误信息。并指出了报错的源文件为:(D:\home\site\wwwroot\pynode\node_modules\node-homedir\index.js:10:26),在源代码中,找出了问题的根源。
问题原因
node_modules\node-homedir\index.js 源码:
1 'use strict'; 2 3 const os = require('os'); 4 5 module.exports = () => { 6 if (process.env.MOCK_HOME_DIR) return process.env.MOCK_HOME_DIR; 7 8 if (typeof os.userInfo === 'function') { 9 try { 10 const homedir =os.userInfo().homedir; 11 if (homedir) return homedir; 12 } catch (err) { 13 if (err.code !== 'ENOENT') throw err; 14 } 15 } 16 17 if (typeof os.homedir === 'function') { 18 return os.homedir(); 19 } 20 21 return process.env.HOME; 22 };
在第十行代码中,使用了os对象,而在App Service中,由于是sandbox 模式下,所以某些操作被禁止了。关于禁止的说明可以参考:https://github.com/projectkudu/kudu/wiki/Azure-Web-App-sandbox#general-sandbox-restrictions
解决方案
在查看源代码后,想解决它就有两种办法:
1) 在修改node-homedir\index.js中的源代码,把里面 os.userInfo().homedir 的部分替换成在App Service中的Homedir路径,hardcode这一部分。如 const homedir =”D:\home\site\wwwroot\“;//os.userInfo().homedir;
2) 最快速且无代码改动方案。在App Service的应用程序设置中(Applicaiton Settings)添加一个名MOCK_HOME_DIR的设置,并设置其值为D:\home\site\wwwroot\ (为应用程序发布的默认路径)。 这样node-homedir的源代码就不会进入到os部分。直接在第一行就返回需要的homedir.
PS: 这里是把NodeJS的应用发布在Windows的环境中遇见的问题,如发布在App Service For Linux则可以避免类似问题。
当在复杂的环境中面临问题,格物之道需:浊而静之徐清,安以动之徐生。 云中,恰是如此!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂