如何解决AWS Cloudfront Lambda@Edge 奇怪的异步/回调用法
我正在尝试将 event
从 lambda@edge 发送到我们的服务器。但我不想“阻止”云端。
为了做到这一点,我写道:(示例)
exports.handler = async (event,_,callback) => {
const req = event.Records[0].cf.request;
callback(null,req);
return send(event);
};
function send(event) {
const https = require('https');
const options = {
hostname: 'httpbin.org',port: 443,path: '/delay/4',method: 'GET'
};
return new Promise(function (resolve,reject) {
const hReq = https.request(options,hRes => {
console.log('response:' + hRes.statusCode);
});
hReq.on('error',(error) => {
console.log(error);
});
hReq.end();
});
}
为了这个问题,我向 httpbin.ord/delay/4
发送了一个请求,以模拟 4 秒的发送请求。
如您所见,我在开始时就在执行 callback(null,req)
,以便释放 Cloudfront 并保持请求流畅。之后我做了 4 秒的发送请求(发送函数)。
有人告诉我,我不能在同一个处理程序上使用 async
和 callback
。
//or like that (only async):
exports.handler = async (event) => {
const req = event.Records[0].cf.request;
???
};
//or like that (only callback):
exports.handler = (event,callback) => {
const req = event.Records[0].cf.request;
???
};
但出于某种原因,它适用于两者。
当我浏览网站时(通过 Cloudfront)我没有被阻止 4 秒。
如果我将回调移动到承诺的解析部分,如下所示:
exports.handler = async (event,callback) => {
const req = event.Records[0].cf.request;
//callback(null,req); <------- REMOVED
return send(event,req);
};
function send(event,req) {
...
return new Promise(function (resolve,hRes => {
console.log('response:' + hRes.statusCode);
callback(null,req); <------------- ADDED
});
hReq.on('error',(error) => {
console.log(error);
});
hReq.end();
});
}
然后开始浏览网站,每个请求需要 4 秒。
所以我的问题是:
- 它如何在同一个处理程序上使用
async
和callback
? - Cloudfront Lambda@Edge 文档说请求会被阻止,直到 lambda 完成。
但是我的请求没有被阻止,即使 lambda 需要大约 4 秒才能运行。为什么?
感谢您的帮助..
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。