Amazon s3 正在尝试检查嵌套异步中是否存在s3 bucket项

Amazon s3 正在尝试检查嵌套异步中是否存在s3 bucket项,amazon-s3,async-await,es6-promise,serverless-framework,Amazon S3,Async Await,Es6 Promise,Serverless Framework,我有一个无服务器Lambda函数,用于响应S3S3:ObjectCreated事件,尝试使用AWS JavaScript SDK使用以下代码位检查S3存储桶中是否存在单独的项: exports.somethingSomeSomething = async (event) => { event.Records.forEach(async (record) => { let tst = await s3.headObject({ Bucket: "mybuck

我有一个无服务器Lambda函数,用于响应S3
S3:ObjectCreated
事件,尝试使用AWS JavaScript SDK使用以下代码位检查S3存储桶中是否存在单独的项:

exports.somethingSomeSomething = async (event) => {

  event.Records.forEach(async (record) => {

    let tst = await s3.headObject({
      Bucket: "mybucket",
      Key: "something.gz"
    }).promise()

    console.log(tst)
  })

};
我对JS中的承诺很生疏,所以我不确定为什么这段代码不起作用。作为参考,它只是死了,没有输出任何东西

但是,以下方法确实有效:


我如何才能让代码的初始位工作,我做错了什么?

这是因为您的代码是
async
,但是传递给
forEach
循环的函数也是
async
,因此您有一个
async
函数调用另一块
async
代码,因此您失去了对流的控制。
forEach
中的任何内容都将运行(尽管
forEach
之后的任何内容都将在
forEach
中的任何内容之前运行),但它将异步执行,您无法跟踪其执行情况

但是,如果像我说的那样,代码将运行,为什么你看不到结果呢

这是因为Lambda将在代码有机会执行之前终止。如果您在本地运行同一段代码,您将看到它将正常运行,但由于原始代码在Lambda上运行,因此您无法控制它何时终止

这里有两个选项:

最简单的方法是获取记录数组中的第一项,因为s3事件每次调用只发送一个事件。它之所以是数组是因为AWS的工作方式(所有事件的公共接口)。无论如何,您的
forEach
没有使用
Record
对象的任何内容,但是如果您想使用它的任何属性,只需引用第0个位置,如下所示:

exports.somethingSomeSomething = async (event) => {
    const record = event.Records[0]

    //do something with record

    const tst = await s3.headObject({
        Bucket: "mybucket",
        Key: "something.gz"
    }).promise()

    console.log(tst)
};
如果您仍然希望使用for循环来迭代记录(尽管对于s3事件同样不需要),请改用
for of
循环:

exports.somethingSomeSomething = async (event) => {
    for (const record of event.Records) {
        // do something with record
        const tst = await s3.headObject({
            Bucket: "mybucket",
            Key: "something.gz"
        }).promise()
        console.log(tst)
    }
};
由于of的
for只是一个常规循环,因此它将使用正在执行的函数中的
async
,因此
wait
在其内部完全有效


更多信息和

回答得很好,谢谢!无循环场景似乎最适合我的特定用例。也就是说,我想知道为什么它在Lambda终止?Lambda的这种行为记录在哪里?谢谢!理论上,您应该能够通过在
context
对象上将“callbackhaitsforemptyeventloop”设置为true来修改此行为,但这是回调样式的一个旧解决方法。我个人从未测试过它是否与
async/await
一起工作。IIRC、回调和承诺在事件循环中设置在不同的数组中,因此我认为
callbackhaitsforemptyeventloop
只会查看是否存在任何挂起的回调,因此我盲目地猜测它不会起作用。有关这些属性的文档位于:
exports.somethingSomeSomething = async (event) => {
    for (const record of event.Records) {
        // do something with record
        const tst = await s3.headObject({
            Bucket: "mybucket",
            Key: "something.gz"
        }).promise()
        console.log(tst)
    }
};