【应用服务 App Service】NodeJS +Egg 发布到App Service时遇见 [ERR_SYSTEM_ERROR]: A system error occurred:uv_os_ge

报错日志

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 源码:

'use strict';

const os = require('os');

module.exports = () => {
  if (process.env.MOCK_HOME_DIR) return process.env.MOCK_HOME_DIR;

  if (typeof os.userInfo === 'function') {
    try {
      const homedir =os.userInfo().homedir;
      if (homedir) return homedir;
    } catch (err) {
      if (err.code !== 'ENOENT') throw err;
    }
  }

  if (typeof os.homedir === 'function') {
    return os.homedir();
  }

  return process.env.HOME;
};

在第十行代码中,使用了os对象,而在
App Service中,由于是sandbox 模式下,所以某些操作被禁止了。关于禁止的说明可以参考:
https://github.com/projectkudu/kudu/wiki/Azure-Web-App-sandbox#general-sandbox-restrictions

解决方案

在查看源代码后,想解决它就有两种办法:

  • 在修改node-homedir\index.js中的源代码,把里面 os.userInfo().homedir 的部分替换成在App Service中的Homedir路径,hardcode这一部分。如 const homedir =”D:\home\site\wwwroot\“;//os.userInfo().homedir;

  • 最快速且无代码改动方案 (推荐)。在App Service的应用程序设置中(Applicaiton Settings)添加一个名MOCK_HOME_DIR的设置,并设置其值为D:\home\site\wwwroot\ (为应用程序发布的默认路径)。 这样node-homedir的源代码就不会进入到os部分。直接在第一行就返回需要的homedir.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值