AWS Lambda函数检查站点是否可用

时间:2019-04-11 12:02:20

标签: node.js aws-lambda amazon-cloudwatch

我想创建一个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();
};

在创建实际功能之前,我在“如何工作”部分中进行了尝试。但是当我运行此程序时,出现错误“在完成请求之前退出流程”

enter image description here

我的目标是在站点关闭时发送警报(使用AWS云监控)。

1 个答案:

答案 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
    }

};