node.js - 用于检查站点是否可用的 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)。
解决方案
您的代码终止,因为您在调用req.end
任何事件之前调用。在底层,这些 API 使用EventEmitter
NodeJS 中的 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
}
};
推荐阅读
- haskell - 有人可以解释这个 Haskell 问题吗?
- android - 搜索/过滤分页列表
- php - 用于 Nginx 和 php-fpm 的 Kubernetes Docker 上的连接错误
- firefox - 语音合成 API 在 Manjaro 上的 Firefox 中不起作用
- reactjs - Apollo Client 3 - 全局事件监听器?
- stata - 用抽样权重计算观测数
- javascript - 如何通过 ctrl + enter 将 br(换行符)添加到 contenteditable div?
- python - Python模拟类属性
- javascript - nextjs 向组件传递数据
- safari - 网页如何向 Safari Web 扩展发送消息?