下面是我的代码的简化。
const AWS = require('aws-sdk');
exports.handler = async (event, context, callback) => {
context.callbackWaitsForEmptyEventLoop = true;
AWS.config.update({region: 'cn-north-1'});
// Create CloudWatch service object
var cw = new AWS.CloudWatch({apiVersion: '2010-08-01'});
var params = {
MetricData: [
{
MetricName: 'PAGES_VISITED',
Dimensions: [
{
Name: 'UNIQUE_PAGES',
Value: 'URLS'
},
],
Unit: 'None',
Value: 1.0
},
],
Namespace: 'MyNewNameSpace'
};
cw.putMetricData(params, function(err, data) {
if (err) {
console.log("Error", err);
} else {
console.log("Success", JSON.stringify(data));
}
});
callback(null, "the result");
};
似乎一旦我设置了 callbackWaitsForEmptyEventLoop = false ,就无法在此处设置指标。我不明白这种冲突。
答案 0 :(得分:0)
如果设置callbackWaitsForEmptyEventLoop = false
,则函数执行将在完成所有回调之前终止。在这种情况下,该函数会在调用cw.putMetricData
的回调之前终止,因此不会执行您的代码。在CloudWatch上的操作可能实际上发生了,但是您没有看到回调,因为它没有发生。
这是您使用async/await
模型,没有回调且没有callbackWaitsForEmptyEventLoop
的函数:
const AWS = require('aws-sdk');
exports.handler = async event => {
AWS.config.update({region: 'cn-north-1'});
// Create CloudWatch service object
var cw = new AWS.CloudWatch({apiVersion: '2010-08-01'});
var params = {...};
await cw.putMetricData(params)
.promise()
.then(data => {console.log("Success", JSON.stringify(data));})
.catch(err => {console.log("Error", err);})
return "the result";
};