我想创建一个AWS Lambda函数来检查该站点是否可用。我尝试了此功能。
'use strict';
var url = require('url');
var target = 'https://www.google.com'; // Change this one
exports.handler = function(event, context, callback) {
var urlObject = url.parse(target);
var mod = require(
urlObject.protocol.substring(0, urlObject.protocol.length - 1)
);
console.log('[INFO] - Checking ' + target);
var req = mod.request(urlObject, function(res) {
res.setEncoding('utf8');
res.on('data', function(chunk) {
console.log('[INFO] - Read body chunk');
});
res.on('end', function() {
console.log('[INFO] - Response end');
callback();
});
});
req.on('error', function(e) {
console.log('[ERROR] - ' + e.message);
callback(e);
});
req.end();
};
在创建实际功能之前,我在“如何工作”部分中进行了尝试。但是当我运行此程序时,出现错误“在完成请求之前退出流程”
我的目标是在站点关闭时发送警报(使用AWS云监控)。
答案 0 :(得分:1)
您的代码终止,因为您在调用任何事件之前调用了req.end
。在底层,这些API在NodeJS中使用EventEmitter
API,因此它将事件发布到正在监听它们的通道,但是由于所有这些都是异步发生的,因此req.end
在这些事件中的任何一个之前被调用被解雇了。
您可以使用request
模块来极大地简化代码。只需打包您的依赖项即可。
我也重构了您的代码以使用async/await,所以我需要对回调进行提示。这样做是一个好习惯。如果您想在出现问题时发送通知,只需将代码放在catch
块中。
'use strict';
const target = 'https://www.google.com'; // Change this one
const request = require('request')
const handler = async (event) => {
try {
const data = await new Promise((res, rej) => {
request.get(target, (err, data) => {
if (err) {
return rej(err)
}
return res(data)
})
})
console.log(data)
} catch (e) {
console.log(e)
//send notification
}
};