2012-09-27 47 views
3

我運行在Azure中的Node.js應用程序讀取Azure的配置設置,並想獲得這樣的配置設置:無法從Node.js的

var azure = require('azure'); 

azure.RoleEnvironment.getConfigurationSettings(function(error, settings) { 
    if (error) { 
     console.log(error); 
     return; 
    } 

    console.log('Settings: %s', settings); 
}); 

但產量始終是這樣的:

{ "code": "ENOENT", "errno": "ENOENT", "syscall": "connect", "fileName": "\\\\.\\pipe\\WindowsAzureRuntime" } 

我正在IIS中使用IISNode使用所有最新的位運行Node.Js。如果我在Azure VM上手動運行節點(即node.exe server.js),我也會得到相同的錯誤。在Azure開發結構中的我的電腦上運行時也是如此。

在此先感謝您的任何幫助或建議!

+0

這個變量找到了一個可行的解決方案將ServiceConfiguration.cscfg設置值設置爲在IISNode內運行的Node.Js。例如,要將一個名爲「TestSetting」的設置作爲IISNode中的環境變量訪問到Node,必須將以下內容添加到ServiceDefintion中。csdef: ' <變量名= 「TestSetting」> ' – Malex

回答

2

既然你提到你在IISNode運行,它必須是一個Web角色。從SDK readme注意以下內容:

The Service Runtime allows you to interact with the machine environment where the current role is running. Please note that these commands will only work if your code is running in a worker role inside the Azure emulator or in the cloud.

+0

Gotcha,沒有看到。我正在測試這個,現在通過啓動任務作爲工作角色啓動節點運行。而且我可以通過環境設置將配置設置傳遞給節點,這很好。但是,即使作爲輔助角色運行,我仍然遇到同樣的錯誤。我看到其他人聲稱有它的工作,所以我必須錯過一些東西,但不知道什麼... – Malex

+0

我有它在這裏工作(雙重檢查之前,我回答)。你會得到完全相同的錯誤?你不是想在該工作者角色中運行IISNode嗎? –

+0

不,工作者角色中沒有IISNode。 :)通過啓動任務啓動它。因此,如果Azure Node.JS客戶端無法訪問Azure配置設置,那麼在IISNode中運行時爲節點提供配置設置的建議方法是什麼?很顯然,將設置放在web.config中是不夠的,因爲如果不創建新的包就無法更改它,並且在IISNode下運行時節點不是通過啓動任務啓動的,所以我無法提供這種設置......不知道如何別的要做... ...? – Malex

0

這是我的解決方案。這不好,但至少現在可以工作。

  1. 創建像使用Microsoft.WindowsAzure此

    一個.NET控制檯應用程序;使用系統的 ; using System.Collections.Generic;使用System.Linq的 ; using System.Text;使用System.Threading的 ; using System.Threading.Tasks;

    命名空間CloudConfigurationHelper { 類節目 { 靜態INT MaxRetryTime = 10;

    public static Dictionary<string, string> GetSettings(string[] keys) 
        { 
         Dictionary<string, string> settings = new Dictionary<string, string>(); 
    
         try 
         { 
          foreach (string key in keys) 
          { 
           settings[key] = CloudConfigurationManager.GetSetting(key); 
          } 
         } 
         catch 
         { 
          MaxRetryTime--; 
    
          if (MaxRetryTime <= 0) 
          { 
           return settings; 
          } 
    
          Thread.Sleep(2000); 
          return GetSettings(keys); 
         } 
    
         return settings; 
        } 
    
        static int Main(string[] args) 
        { 
         var settings = GetSettings(args); 
         if (settings.Count != args.Length) 
         { 
          return -1; 
         } 
    
         foreach (string key in settings.Keys) 
         { 
          Console.WriteLine(key + "=" + settings[key]); 
         } 
    
         return 0; 
        } 
    } 
    

    }

  2. 認沽啓動任務讀取蔚藍的配置變量和寫入.ENV文件。使用https://github.com/motdotla/dotenv讀取.env文件並加載到process.env。

Env.cmd文件:

@echo off 
cd %~dp0 
CloudConfigurationHelper.exe %* 

添加啓動任務ServiceDefinition.csdef中:

<Task commandLine="Env.cmd YOUR_SETTING_KEY &gt; ..\.env executionContext="elevated" /> 
  • 在網絡的NodeJS作用,我們只需要通過閱讀process.env["YOUR_SETTING_KEY"]
  • +0

    它應該是process.env而不是.evn嗎? –

    +0

    是的,謝謝。這是我的錯字。 – quinvit