在Node.js中,使用async / await处理错误的正确方法是什么?

时间:2018-07-08 01:59:36

标签: node.js error-handling async-await

当前,我具有以下功能:

export async function getFiles (param: any) {

    try {

        const results = await ... // code to get results from database;
        const files = [];
        for (let i = 0; i < results.length; i++) {

              files.push(results[i]);
        }
        return files;
    }
    catch (error) {
        console.log(error);
    }

}

另外,我使用库函数如下:

    const files = await lib.getFilesAsync(param);
    for (const file of files) {
        // process file here
    }

如何为该代码正确添加错误处理?

我尝试返回catch中的错误:

catch (error) {
    console.log(error);
    return new Error("getFiles error");
}

但随后在编译时出现以下错误:

Type 'Error' must have a '[Symbol.iterator]()' method that returns an iterator. (2488)

1 个答案:

答案 0 :(得分:2)

一个async函数返回一个Promise。因此,在该async函数中,您必须做出有关是否要返回错误的承诺或要测试的特定错误的设计决策。无论哪种情况,async函数的调用者都需要进行错误检查。这是两种实现方法。真正的选择是您的设计选择。

它在某种程度上类似于同步函数,该函数可以返回类似null的前哨值,当发生错误时必须由调用方对其进行测试,或者可以引发异常,而调用方将捕获该异常尝试/捕获。

呼叫者使用.catch()try/catch

export async function getFiles (param: any) {
    // if any await operation here rejects, the promise returned
    // from getFiles() will reject and the caller can .catch() the error
    const results = await ... // code to get results from database;
    const files = [];
    for (let i = 0; i < results.length; i++) {
         files.push(results[i]);
    }
    return files;
}

// usage
getFiles(...).then(files => {
    console.log(files);
}).catch(err => {
    console.log(err);
})

// or, you could use it this way
try {
    let files = await getFiles(...);
    console.log(files);
} catch(e) {
    console.log(e);
}

呼叫者检查已解决的承诺是否存在错误

export async function getFiles (param: any) {

    try {
        const results = await ... // code to get results from database;
        const files = [];
        for (let i = 0; i < results.length; i++) {

              files.push(results[i]);
        }
        return files;
    }
    catch (error) {
        console.log(error);
        return new Error("getFiles error");
    }
}

// usage:
getFiles(...).then(files => {
    console.log(files);
    if (files instanceof Error) {
        // error
    } else {
        // process files array here
    }
});

// or, you could use it this way
let files = await getFiles(...);
console.log(files);
if (files instanceof Error) {
    // error
} else {
    // process files array here
}

我个人更喜欢使用被拒绝的诺言,因为如果让诺言为您管理错误传播,则对异步操作进行排序或链接会容易得多。