从nodejs中的回调获取列表
Getting Lists from callback in nodejs
我正在尝试获取 Rackspace 中特定 "stack" 的 "servers" 列表。我必须对堆栈资源进行一些处理才能获取服务器列表,因为某些服务器位于资源组(嵌套)中。我通过异步调用一个一个地获取每个服务器。如何将它们捆绑在一起并一次性发送给客户?
下面是代码:
app.js
function setClient(credentials)
{
var client = pkgcloud.orchestration.createClient({
provider: 'rackspace',
username: credentials.uname,
apiKey: credentials.key,
region: 'HKG'
});
return client;
}
app.io.route('ready', function(req) {
var client = setClient(req.session.credentials);
client.getStacks(function (err, stacks) {
if (err) {
req.io.emit("error", { error: err.result.error.message });
return;
}
if (stacks.length > 0) {
var stack = stacks[0].name;
getSer(stack, client, req, 'init');
}
req.io.emit("showStacks", { stacks: stacks });
});
});
app.io.route('create_stack', function(req) {
var stack = req.data.stack_name;
var tmpl = req.data.content;
var client = setClient(req.session.credentials);
client.createStack({
name: stack,
timeout: 60,
template: tmpl // Heat template
}, handle(req));
});
function handle(req) {
return function handle(err, stack)
{
var client = setClient(req.session.credentials);
if (err) {
req.io.emit("error", { error: err.result.error.message });
console.dir(err.result.error.message);
return;
}
client.getStacks(function (err, stacks) {
req.io.emit("showStacks", { stacks: stacks });
});
req.io.emit("status", {status: 'Stack created'});
// Wait for status: CREATE_COMPLETE on our stack, and then callback
stack.setWait({ status: 'CREATE_COMPLETE' }, 5000, function (err) {
if (err) {
req.io.emit("error", { error: err.result.error.message });
console.dir(err);
return;
}
client.getStacks(function (err, stacks) {
req.io.emit("showStacks", { stacks: stacks });
});
client.getStack(stack, function (err, stack) {
if (err) {
req.io.emit("error", { error: err.result.error.message });
console.dir(err.result.error.message);
return;
}
req.io.emit("showStack", { stack: stack });
});
getSer(stack, client, req, 'create');
});
}
}
function getSer(stack, client, req, mode)
{
client.getResources(stack, function(err, resources) {
if (err) {
console.dir(err);
req.io.emit("error", { error: err.result.error.message });
return;
}
resources.forEach(function (resource) {
var nestedlink = '';
var nested = false;
if (resource.links != undefined) {
resource.links.forEach(function (link) {
if (link.rel == "nested") {
nestedlink = link.href;
nested = true;
}
});
}
if (nested) {
var stack_name = nestedlink.substr(nestedlink.indexOf('stacks/')+7, nestedlink.lastIndexOf('/'));
getSer(stack_name, client, req, mode);
} else {
var serId = resource.physicalResourceId;
var ser = serClient(req.session.credentials);
ser.getServer(serId, function (err, server) {
if (mode == 'init')
req.io.emit("showServer", { server: server});
else if (mode == 'create')
req.io.emit("stackCreate", { server: server});
});
}
});
});
}
实际上,问题是 pkgcloud 有一个方法 'getResources' 给定堆栈名称 returns 资源。从中我得到 'physical_resource_id' (server_id) 的服务器,它不在一个组中,但对于通过 'OS::Heat::ResourceGroup' 创建的服务器,一个人做一些额外的工作,因为资源列表只有一个 'nested' link 为它。因此,我从嵌套的 'link' 中取出 stack_name 并获取其服务器 ID var stack_name = nestedlink.substr(nestedlink.indexOf('stacks/')+7, nestedlink.lastIndexOf('/'));
。如果 pkgcloud 有类似给定堆栈名称的东西,它会 return 列出其中的服务器,生活会很轻松。
我在评论(https://github.com/pkgcloud/pkgcloud/issues/410)中提到的问题现已修复。通过该修复,您应该能够请求堆栈的所有资源列表,包括嵌套资源。只需在您的代码中执行此操作:
client.getResources(stack, { nestedDepth: XXX }, function(err, resources) {
其中 XXX
是足够的嵌套深度,具体取决于您的堆栈。
而不是:
client.getResources(stack, function(err, resources) {
pkgcloud 的修复将包含在下一个正式版本中。这可能在几周或几个月内不可用,因此如果您需要立即下载此修复程序,您可以使用以下命令执行此操作:
npm install https://github.com/pkgcloud/pkgcloud/tarball/master
或者,您可以修改项目 package.json
中的 pkgcloud
依赖项,如下所示:
"pkgcloud": "git://github.com/pkgcloud/pkgcloud.git"
我正在尝试获取 Rackspace 中特定 "stack" 的 "servers" 列表。我必须对堆栈资源进行一些处理才能获取服务器列表,因为某些服务器位于资源组(嵌套)中。我通过异步调用一个一个地获取每个服务器。如何将它们捆绑在一起并一次性发送给客户? 下面是代码:
app.js
function setClient(credentials)
{
var client = pkgcloud.orchestration.createClient({
provider: 'rackspace',
username: credentials.uname,
apiKey: credentials.key,
region: 'HKG'
});
return client;
}
app.io.route('ready', function(req) {
var client = setClient(req.session.credentials);
client.getStacks(function (err, stacks) {
if (err) {
req.io.emit("error", { error: err.result.error.message });
return;
}
if (stacks.length > 0) {
var stack = stacks[0].name;
getSer(stack, client, req, 'init');
}
req.io.emit("showStacks", { stacks: stacks });
});
});
app.io.route('create_stack', function(req) {
var stack = req.data.stack_name;
var tmpl = req.data.content;
var client = setClient(req.session.credentials);
client.createStack({
name: stack,
timeout: 60,
template: tmpl // Heat template
}, handle(req));
});
function handle(req) {
return function handle(err, stack)
{
var client = setClient(req.session.credentials);
if (err) {
req.io.emit("error", { error: err.result.error.message });
console.dir(err.result.error.message);
return;
}
client.getStacks(function (err, stacks) {
req.io.emit("showStacks", { stacks: stacks });
});
req.io.emit("status", {status: 'Stack created'});
// Wait for status: CREATE_COMPLETE on our stack, and then callback
stack.setWait({ status: 'CREATE_COMPLETE' }, 5000, function (err) {
if (err) {
req.io.emit("error", { error: err.result.error.message });
console.dir(err);
return;
}
client.getStacks(function (err, stacks) {
req.io.emit("showStacks", { stacks: stacks });
});
client.getStack(stack, function (err, stack) {
if (err) {
req.io.emit("error", { error: err.result.error.message });
console.dir(err.result.error.message);
return;
}
req.io.emit("showStack", { stack: stack });
});
getSer(stack, client, req, 'create');
});
}
}
function getSer(stack, client, req, mode)
{
client.getResources(stack, function(err, resources) {
if (err) {
console.dir(err);
req.io.emit("error", { error: err.result.error.message });
return;
}
resources.forEach(function (resource) {
var nestedlink = '';
var nested = false;
if (resource.links != undefined) {
resource.links.forEach(function (link) {
if (link.rel == "nested") {
nestedlink = link.href;
nested = true;
}
});
}
if (nested) {
var stack_name = nestedlink.substr(nestedlink.indexOf('stacks/')+7, nestedlink.lastIndexOf('/'));
getSer(stack_name, client, req, mode);
} else {
var serId = resource.physicalResourceId;
var ser = serClient(req.session.credentials);
ser.getServer(serId, function (err, server) {
if (mode == 'init')
req.io.emit("showServer", { server: server});
else if (mode == 'create')
req.io.emit("stackCreate", { server: server});
});
}
});
});
}
实际上,问题是 pkgcloud 有一个方法 'getResources' 给定堆栈名称 returns 资源。从中我得到 'physical_resource_id' (server_id) 的服务器,它不在一个组中,但对于通过 'OS::Heat::ResourceGroup' 创建的服务器,一个人做一些额外的工作,因为资源列表只有一个 'nested' link 为它。因此,我从嵌套的 'link' 中取出 stack_name 并获取其服务器 ID var stack_name = nestedlink.substr(nestedlink.indexOf('stacks/')+7, nestedlink.lastIndexOf('/'));
。如果 pkgcloud 有类似给定堆栈名称的东西,它会 return 列出其中的服务器,生活会很轻松。
我在评论(https://github.com/pkgcloud/pkgcloud/issues/410)中提到的问题现已修复。通过该修复,您应该能够请求堆栈的所有资源列表,包括嵌套资源。只需在您的代码中执行此操作:
client.getResources(stack, { nestedDepth: XXX }, function(err, resources) {
其中 XXX
是足够的嵌套深度,具体取决于您的堆栈。
而不是:
client.getResources(stack, function(err, resources) {
pkgcloud 的修复将包含在下一个正式版本中。这可能在几周或几个月内不可用,因此如果您需要立即下载此修复程序,您可以使用以下命令执行此操作:
npm install https://github.com/pkgcloud/pkgcloud/tarball/master
或者,您可以修改项目 package.json
中的 pkgcloud
依赖项,如下所示:
"pkgcloud": "git://github.com/pkgcloud/pkgcloud.git"