2016-09-20 50 views
0

我試圖通過節點應用程序連接到Bluemix上的Message Hub服務實例。我能夠通過cfenv連接在文件給出:如何使用cfenv和vcap服務通過節點應用程序連接到bluemix上的Message Hub服務

var Cfenv = require('cfenv'); 
var appEnv = Cfenv.getAppEnv(); 
if(restEndpoint && apiKey) { 
    appEnv.services = { 
    "messagehub": [ 
     { 
      "label": "messagehub", 
      "credentials": { 
      "api_key": apiKey, 
      "kafka_rest_url": restEndpoint, 
      } 
     } 
    ] 
    }; 
} else { 
    console.error('A REST Endpoint and API Key must be provided.'); 
    process.exit(1); 
} 

爲了這個,我在我的節點的應用程序,這是在Bluemix服務憑據創建直接給API密鑰和restEndpoint。

restEndpoint = "https://kafka-rest-**************" 

apiKey = "*******************" 

但我不想在代碼本身給出上述細節以保證安全。那麼無論如何,我可以阻止提供上述憑據並致電該服務?我開始知道我們可以使用cfenv和VCAP_serives來實現它,但我不知道如何去做。有人可以幫我提一些想法嗎?

我在這裏編輯我的問題本身, 我使用cfenv從我的節點應用程序連接到消息中心服務,但是這些值是硬編碼的,如下所示。

restEndpoint = "https://kafka-rest-***************************" 

apiKey = "******************************" 


if(restEndpoint && apiKey) { 
    appEnv.services = { 
    "messagehub": [ 
     { 
      "label": "messagehub", 
      "credentials": { 
      "api_key": apiKey, 
      "kafka_rest_url": restEndpoint, 
      } 
     } 
    ] 
    }; 
} else { 
    console.error('A REST Endpoint and API Key must be provided.'); 
    process.exit(1); 
} 
var instance = new MessageHub(appEnv.services); 

但現在推到bluemix我的環境變量(VCAP服務)

"messagehub": [ 
    { 
    "credentials": { 
     "mqlight_lookup_url": "https://mqlight*********", 
     "api_key": "**************", 
     "kafka_admin_url": "https://kafka-admin-***********", 
     "kafka_rest_url": "https://kafka-rest-********", 

     "user": "*****", 
     "password": "*******" 
    }, 
    "syslog_drain_url": null, 
    "label": "messagehub", 
    "provider": null, 
    "plan": "standard", 
    "name": "Message Hub", 
    "tags": [ 
     "ibm_dedicated_public", 
     "web_and_app", 
     "ibm_created" 
    ] 
    } 

]

所以,我怎麼可以連接到信息樞紐服務使用上述VCAP_SERVICES而不是之後對代碼本身的值進行硬編碼。

謝謝。

回答

2

是的,你可以在運行時檢索你的服務的憑據。

在Bluemix中運行時,使用Node.js時,它們存儲在process.env.VCAP_SERVICES中。

您也可以直接從Bluemix UI檢查此JSON對象。導航到您的應用程序的儀表板並轉到環境變量。解析VCAP_SERVICES

示例代碼:

var serviceName = 'messagehub'; 
var opts = {}; 
if (process.env.VCAP_SERVICES) { 
    // Running in Bluemix 
    var services = JSON.parse(process.env.VCAP_SERVICES); 
    for (var key in services) { 
     if (key.lastIndexOf(serviceName, 0) === 0) { 
      messageHubService = services[key][0]; 
      opts.broker = messageHubService.credentials.kafka_brokers_sasl; 
      opts.user = messageHubService.credentials.user; 
      opts.password = messageHubService.credentials.password; 
     } 
    } 
    if (!opts.hasOwnProperty('broker') || !opts.hasOwnProperty('user') || !opts.hasOwnProperty('password')) { 
     throw 'Error - Check your app is bound to a ' + serviceName + ' service'; 
    } 
} else { 
    // Running locally 
    opts.broker = 'localhost:9093'; 
    opts.user = 'username'; 
    opts.password = 'password'; 
} 

在本地運行,你可以選擇做你想要的方式: - 如果你想在Bluemix也運行,建立一個本地的環境變量模仿VCAP_SERVICES可能是一個好主意,所以兩者都可以使用相同的邏輯。 - 如果沒有,你可以寫一個getter從一個安全的位置獲取你的憑證。

cfenv(https://www.npmjs.com/package/cfenv)允許抽象它的一部分,比如檢測是否在本地運行或在Bluemix中運行,解析VCAP_SERVICES等等。但是如果在本地運行,您仍然必須爲其提供值。

+0

謝謝@Mickael。但我的應用程序在本地,那麼我在哪裏可以看到環境變量,即如何獲取process.env.VCAP_SERVICES? –

+0

我已經更新了我的答案,希望它有幫助 –

+1

我在Bluemix中添加了解析VCAP_SERVICES的示例代碼 –

相關問題