我在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 Development Fabric中在我的PC上运行时也是如此。
提前感谢您的任何帮助或建议!
答案 0 :(得分:2)
由于您提到您在IISNode中运行,因此它必须是Web角色。请注意SDK readme中的以下内容:
Service Runtime允许您与运行当前角色的计算机环境进行交互。请注意,这些命令仅在您的代码在Azure模拟器内或云中以工作者角色运行时才有效。
答案 1 :(得分:0)
这是我的解决方案。这不好,但至少它现在有效。
像这样创建一个.NET控制台应用程序
使用Microsoft.WindowsAzure; 使用系统; 使用System.Collections.Generic; 使用System.Linq; 使用System.Text; 使用System.Threading; 使用System.Threading.Tasks;
命名空间CloudConfigurationHelper { 课程 { static 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;
}
}
}
启动启动任务以读取azure配置变量并写入.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 > ..\.env executionContext="elevated" />
process.env["YOUR_SETTING_KEY"]