0

我在 Bluemix 上有一个 Message Hub 服务实例,我试图通过节点应用程序连接到该实例。我可以通过文档中给出的 cfenv 进行连接:

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);
}

为此,我直接在我的节点应用程序中提供 API 密钥和 restEndpoint,它们是在 Bluemix 服务凭证中创建的。

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 连接到消息中心服务,而不是硬编码代码本身中的值。

谢谢。

4

1 回答 1

2

是的,您可以在运行时检索服务的凭据。

当使用 Node.js 在 Bluemix 中运行时,它们存储在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 等。但如果在本地运行,您仍然必须为其提供您的值。

于 2016-09-20T09:28:35.663 回答