首页 > 解决方案 > 用于检查站点是否可用的 AWS Lambda 函数

问题描述

我想创建一个 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 cloud-watch)。

标签: node.jsaws-lambdaamazon-cloudwatch

解决方案


您的代码终止,因为您在调用req.end任何事件之前调用。在底层,这些 API 使用EventEmitterNodeJS 中的 API,因此它将事件发布到正在侦听它们的通道,但是由于所有这些都是异步发生的,req.end因此在任何这些事件被触发之前都会被调用。

您可以使用该request模块大大简化您的代码。只需将它与您的依赖项一起打包。

我已经稍微重构了你的代码以使用async/await,所以我需要 promisy 回调。这样做是个好习惯。如果您想在出现问题时发送通知,只需将代码放入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
    }

};

推荐阅读