[英]Getting Lists from callback in nodejs
我正在嘗試獲取Rackspace中特定“堆棧”的“服務器”列表。 我必須對堆棧資源進行一些處理才能獲取服務器列表,因為某些服務器位於資源組(嵌套)中。 我通過異步調用逐一獲得每個服務器。 如何將它們捆綁在一起並一次性發送給客戶? 下面是代碼:
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”,該方法給出堆棧名稱返回資源。 從中,我獲得不在組中的服務器的“ physical_resource_id”(server_id),但是對於通過“ OS :: Heat :: ResourceGroup”創建的服務器,它會做一些額外的工作,因為資源列表中只有一個“嵌套”鏈接。 因此,我從嵌套的“鏈接”中獲取var stack_name = nestedlink.substr(nestedlink.indexOf('stacks/')+7, nestedlink.lastIndexOf('/'));
並獲取其服務器var stack_name = nestedlink.substr(nestedlink.indexOf('stacks/')+7, nestedlink.lastIndexOf('/'));
。 如果pkgcloud具有類似給定堆棧名稱的內容,它將返回其中的服務器列表,生活將會很輕松。
我在評論( 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"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.