我怎樣才能 console.log 存盤在promise變數中的承諾?我想稍后將其分配給一個變數。
function getMetricFilters() {
const promise = new Promise(function(resolve, reject) {
exec("aws cloudwatch list-metrics --namespace AWS/ApiGateway | jq -r .Metrics[].Dimensions[].Name | sort -u", (error, stdout, stderr) => {
if (error) {
console.error(`error: ${error.message}`);
//return errorResponse(500, 'Error running migration.');
}
if (stderr) {
console.log(`stderr: ${stderr}`);
//return errorResponse(500, 'Error running migration.');
}
console.log(`stdout: ${stdout}`);
//return okResponse(200, 'Migration successfully.');
})
})
return promise
}
getMetricFilters() // I want the result of promise to be printed out or store it in a variable.
如果我不使用該getMetricFilters函式,則它會列印出stdout值。但如果使用該函式,則不會列印任何內容。
完整代碼:
var AWS = require('aws-sdk');
AWS.config.region = 'ap-south-1';
var lambda = new AWS.Lambda();
const exec = require("child_process").exec;
exports.handler = function(event, context, callback) {
console.log("AWS lambda and SNS trigger ");
console.log(event);
const promise = new Promise(function(resolve, reject) {
exec("ls /usr/bin/", (error, stdout, stderr) => {
if (error) {
console.error(`error: ${error.message}`);
//return errorResponse(500, 'Error running migration.');
}
if (stderr) {
console.log(`stderr: ${stderr}`);
//return errorResponse(500, 'Error running migration.');
}
console.log(`stdout: ${stdout}`);
//return okResponse(200, 'Migration successfully.');
})
})
return promise // Right now it ends here. But I intened to do other things instead of return and end here.
var sns = JSON.parse(event.Records[0].Sns.Message);
var sns_MetricName = sns.Trigger.MetricName;
var sns_NameSpace = sns.Trigger.Namespace;
console.log(sns.Trigger.Dimensions)
function dimensionValue(name) {
console.log("Testing")
var dimensionsValue = sns.Trigger.Dimensions.find(dimension => dimension.name === name).value
return dimensionsValue
}
function dimensionName(name) {
return sns.Trigger.Dimensions.find(dimension => dimension.name === name)
}
if (sns.Trigger.Namespace == "AWS/S3") {
var sns_DimensionsValue = dimensionValue('BucketName') '_' dimensionValue('StorageType')
}
console.log("Printing SNS DimensionsValue")
console.log(sns_DimensionsValue)
var zabbix_Hostname = JSON.stringify(sns_NameSpace.replace("/", "_"));
var zabbix_Key = "AWS[" sns_DimensionsValue '_' sns_MetricName "]"
var zabbix_Key = JSON.stringify(zabbix_Key);
console.log("Printing SNS")
console.log(event.Records[0].Sns.Message)
var params = {
FunctionName: 'zabbixPy', // the lambda function we are going to invoke
InvocationType: 'RequestResponse',
LogType: 'Tail',
Payload: `{ "Host": ${zabbix_Hostname}, "Key": ${zabbix_Key}, "Value": "1"}`
};
lambda.invoke(params, function(err, data) {
if (err) {
context.fail(err);
} else {
context.succeed('zabbixPy said ' data.Payload);
}
})
console.log("End of function");
};
uj5u.com熱心網友回復:
制作一個可重用的輔助函式,封裝exec()在一個 Promise 中:
function execAsync(cmdline) {
return new Promise((resolve, reject) => {
exec(cmdline, (error, stdout, stderr) => {
if (error) reject({error, stdout, stderr});
else resolve({stdout, stderr});
});
});
}
為您的 cloudwatch 命令創建一個函式:
function getMetricFilters() {
return execAsync("aws cloudwatch list-metrics --namespace AWS/ApiGateway | jq -r .Metrics[].Dimensions[].Name | sort -u");
}
用它:
getMetricFilters()
.then(({stdout, stderr}) => {
okResponse(200, 'Migration completed successfully.');
})
.catch(({error, stdout, stderr}) => {
console.error(`error: ${error.message}`);
console.log(`stdout: ${stdout}`);
console.log(`stderr: ${stderr}`);
errorResponse(500, 'Error running migration.');
});
混合節點樣式的回呼和承諾通常不會很好地結束。
由于您exports.handler的函式是基于回呼的函式,而所有其他函式(如exec()和lambda.invoke())都是基于回呼的,因此我將保留整個代碼基于回呼的函式。
該async模塊為此提供了有用的幫助程式,例如waterfall(),它一個接一個地執行異步函式串列,將前一個的結果傳遞給下一個。
exports.handler = function (event, context, callback) {
async.waterfall([
// 1. parse SNS message (throw if invalid/unexpected)
(callback) => {
const sns = JSON.parse(event.Records[0].Sns.Message);
console.log(1, sns);
const Namespace = sns.Trigger.Namespace;
if (Namespace !== "AWS/S3") throw new Error('Unexpected Namespace: ' Namespace);
const msgData = {
Namespace: Namespace,
MetricName: sns.Trigger.MetricName,
BucketName: sns.Trigger.Dimensions.find(where('name', 'BucketName')).value,
StorageType: sns.Trigger.Dimensions.find(where('name', 'StorageType')).value
};
callback(null, msgData);
},
// 2. run cloudwatch command
(msgData, callback) => {
console.log(2, msgData);
const cmdline = "aws cloudwatch list-metrics --Namespace AWS/ApiGateway | jq -r .Metrics[].Dimensions[].Name | sort -u";
exec(cmdline, (err, stdout, stderr) => {
if (err) return callback(err);
callback(null, msgData, stdout, stderr);
});
},
// 3. run zabbixPy
(msgData, stdout, stderr, callback) => {
console.log(3, msgData, stdout);
lambda.invoke({
FunctionName: 'zabbixPy',
InvocationType: 'RequestResponse',
LogType: 'Tail',
Payload: JSON.stringify({
Host: msgData.Namespace.replace("/", "_"),
key: `AWS[${msgData.BucketName}_${msgData.StorageType}_${msgData.MetricName}]`,
Value: "1"
})
}, callback);
},
// 4. next step...
(zabbixResponse, callback) => {
console.log(4, zabbixResponse.Payload);
// ...
callback(null, 'All done.');
},
], (err, result) => {
if (err) {
console.error(err);
context.fail(err);
callback(err);
return;
}
console.log(result); // 'All done.'
// don't forget to call the main callback here
});
};
另一種方法是將該代碼路徑中的所有異步函式轉換為基于承諾的函式。不確定這是否減少了作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/362817.html
標籤:javascript 节点.js
上一篇:頁面重繪問題
