我试图理解为什么我遇到的承诺拒绝例外不存在 由我在以下代码中的初始try / catch处理(完整代码在this branch)
在此特定错误中,在index.js中调用了nodeCf.deploy
。
错误正在发生,因为我应该使用this.deployName
,而不是stack.deployName
在我的console.log语句中。
我不明白的原因是为什么这被认为是一种不受欢迎的承诺拒绝。 我不应该在对nodeCf.deploy的初始调用中遇到try / catch吗?
// index.js:
switch (args.action) {
case 'deploy':
try {
await nodeCf.deploy(stacks, envVars);
} catch (e) {
console.log(`deployment failed: `, e);
process.exit(1);
}
break;
< ... >
// nodeCf module:
async deploy(stacks, envVars) {
var stackOutputs = {};
await Promise.each(stacks, async(stack) => {
stackOutputs[stack.name] = await stack.deploy(envVars,
stackOutputs).outputs;
});
}
// stack.deploy:
async deploy(envVars, stackOutputs) {
this.load(envVars, stackOutputs);
await ensureBucket(this.infraBucket);
const s3Resp = await this.uploadTemplate()
const stackResp = await ensureAwsCfStack({
StackName: this.deployName,
Parameters: this.parameters,
Tags: this.tags,
TemplateURL: s3Resp.Location,
Capabilities: [ 'CAPABILITY_IAM',
'CAPABILITY_NAMED_IAM' ]
});
this.outputs = _.map(stackResp.Outputs, (it) =>
_(it).pick(['OutputKey', 'OutputValue'])
.toPairs()
.unzip()
.tail()
.fromPairs()
.value());
console.log(`deployed ${stack.deployName}`); // 'stack' is causing exception
return this;
}
答案 0 :(得分:8)
这是你的问题:
stackOutputs[stack.name] = await stack.deploy(envVars, stackOutputs).outputs;
请注意stack.deploy
是async function
?这意味着它返回一个promise - 而不是具有outputs
属性的实例。您正在访问.outputs
的承诺,undefined
,await
即可,但承诺及其拒绝将被忽略。
你需要写
stackOutputs[stack.name] = (await stack.deploy(envVars, stackOutputs)).outputs;
// ^ ^
或为实例使用辅助变量。