【问题标题】:Pending promise in aws lambda functionaws lambda 函数中的待处理承诺
【发布时间】:2021-08-01 19:00:53
【问题描述】:

我正在使用库JSZip 解压缩文件,并且我能够获取每个文件名。但是,我要做的是对文件的内容进行一些处理。我知道您可以根据 API 执行 zip.file(name).async(type).then() 来做到这一点。

但由于某种原因,当我在我的 lambda 函数中执行此操作时,它根本不会命中该函数。我试图返回那行代码,但我刚刚得到Promise <pending>...我试图用 try/catch 包装它,但没有做任何事情。我做了一个异步/等待,但这也不起作用。像这样的回调:

zip.file(name).async('blob').then(function(content) {
    //Do processing in here
});

似乎也不起作用。我需要做什么才能获取特定文件的内容?我所做的一切都不是工作,我认为这与未决的承诺有关。我被困在这一点上,不知道该怎么做。非常感谢任何帮助。以下是我的代码供参考:

let zip = new JSZip();

zip.loadAsync(file).then(function(contents) {
    Object.keys(contents.files).forEach(function(name) {
        zip.file(name).async('blob').then(function(content) {
            // Processing here
        });
    });
});

编辑

完整代码:

index.js

const manager = require("./manager.js");

exports.handler = async (event, context, callback) => {     
    return manager.manager(event, callback);
};

manager.js

exports.manager = async function (event, callback) {
    const path = '/temp/' + fileName;
    const file = fs.readFileSync(path);

    let zip = new JSZip();
    
    zip.loadAsync(file).then(function(contents) {
        Object.keys(contents.files).forEach(function(name) {
            zip.file(name).async('blob').then(function(content) {
                // Processing here
            });
        });
    });
}

【问题讨论】:

  • CloudWatch Logs 向您展示了什么? Lambda 函数是否超时或正常完成?您的 Lambda 函数返回什么?您没有包含代码的关键部分(例如用于调试的控制台日志、Lambda 的函数声明、Lambda 的返回语句)。
  • lambda 函数正常完成。除了我包含的控制台日志之外,没有从 lambda 返回任何内容。我将更新我的问题以提供完整代码
  • 在您的 Lambda 处理程序声明中,不要同时使用异步和回调。使用其中一个(最好是异步的)。此外,对于异步处理程序,您向 Lambda 运行时返回响应、错误或承诺。不要返回任何东西。
  • async 函数中,您也应该使用await 关键字。
  • 您希望您的manager 返回什么?

标签: node.js aws-lambda async-await promise jszip


【解决方案1】:

更改为函数返回: return zip.loadAsync(file).then(...)

【讨论】:

    猜你喜欢
    • 2022-11-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 2021-07-22
    • 1970-01-01
    • 2017-12-15
    • 2020-12-20
    相关资源
    最近更新 更多