Функция AWS Lambda для проверки доступности сайта - PullRequest
1 голос
/ 11 апреля 2019

Я хочу создать функцию 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 Ответ

1 голос
/ 11 апреля 2019

Ваш код завершается, потому что вы вызываете req.end до того, как будут вызваны какие-либо события. Внутри этих API используется API-интерфейс EventEmitter в NodeJS, поэтому он публикует события в каналах, которые их слушают, но, поскольку все это происходит асинхронно, 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
    }

};
...