zoukankan      html  css  js  c++  java
  • 【应用服务 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则可以避免类似问题。

    当在复杂的环境中面临问题,格物之道需:浊而静之徐清,安以动之徐生。 云中,恰是如此!

  • 相关阅读:
    172. Factorial Trailing Zeroes
    96. Unique Binary Search Trees
    95. Unique Binary Search Trees II
    91. Decode Ways
    LeetCode 328 奇偶链表
    LeetCode 72 编辑距离
    LeetCode 226 翻转二叉树
    LeetCode 79单词搜索
    LeetCode 198 打家劫舍
    LeetCode 504 七进制数
  • 原文地址:https://www.cnblogs.com/lulight/p/13512360.html
Copyright © 2011-2022 走看看