我在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连接到消息中心服务,而不是硬编码代码本身的值。
感谢。
答案 0 :(得分:2)
是的,您可以在运行时检索服务的凭据。
使用Node.js在Bluemix中运行时,它们存储在process.env.VCAP_SERVICES
中。
您也可以从Bluemix UI直接检查此JSON对象。导航到应用程序的仪表板并转到Environment Variables。
解析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等。但如果在本地运行,你仍然必须给它你的值。