微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

AWS Cloudfront Lambda@Edge 奇怪的异步/回调用法

如何解决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 秒的发送请求(发送函数)。

有人告诉我,我不能在同一个处理程序上使用 asynccallback

//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 秒。

所以我的问题是:

  1. 它如何在同一个处理程序上使用 asynccallback
  2. Cloudfront Lambda@Edge 文档说请求会被阻止,直到 lambda 完成。
    但是我的请求没有被阻止,即使 lambda 需要大约 4 秒才能运行。为什么?

感谢您的帮助..

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。