Javascript Firebase函数如何正确处理错误 注意:这个问题主要是关于错误处理的,如果这是一个确定的方法,而不是关于嵌套承诺,请在结束之前阅读

Javascript Firebase函数如何正确处理错误 注意:这个问题主要是关于错误处理的,如果这是一个确定的方法,而不是关于嵌套承诺,请在结束之前阅读,javascript,firebase,error-handling,google-cloud-functions,Javascript,Firebase,Error Handling,Google Cloud Functions,由于firestore和firebase数据库等服务目前没有错误代码,因此我使用一个系统来了解函数的故障位置,并相应地处理错误,简化版本如下: exports.doStuff = functions.https.onCall((data, context) => { return [promise doing stuff goes here].catch(error => { throw new Error('ERROR0') }) .then(result

由于firestore和firebase数据库等服务目前没有错误代码,因此我使用一个系统来了解函数的故障位置,并相应地处理错误,简化版本如下:

exports.doStuff = functions.https.onCall((data, context) => {

    return [promise doing stuff goes here].catch(error => { throw new Error('ERROR0') })
        .then(result => {
            return [promise doing stuff goes here, needs result of previous promise]
                .catch(error => { throw new Error('ERROR1') })
        })
        .then(result => {
            return [promise doing stuff goes here, needs result of previous promise]
                .catch(error => { throw new Error('ERROR2') })
        })
        .then(result => {
            //inform client function successful
            return {
                success: true
            }
        })
        .catch(error => {
            if (error !== null) {
                switch (error.message) {
                    case 'ERROR0':
                        //do stuff
                        throw new functions.https.HttpsError('unknown', 'ERROR0');
                    case 'ERROR1':
                        //do stuff
                        throw new functions.https.HttpsError('unknown', 'ERROR1');
                    case 'ERROR2':
                        //do stuff
                        throw new functions.https.HttpsError('unknown', 'ERROR2');
                    default:
                        console.error('uncaught error: ', error);
                        throw error;
                }
            }
        });
});
问题是,对于每个返回的承诺中的每个
.catch()
,我得到以下警告:
警告避免嵌套承诺


所以我的问题是,有没有更好的方法来处理错误?

最终,这是一个风格建议,以防止出现奇怪且难以识别的错误。大多数情况下,重写可以消除警告。例如,您可以按如下方式重写代码,同时保留相同的功能

exports.doStuff = functions.https.onCall(async (data, context) => {

    const result1 = await [promise doing stuff goes here]
      .catch(error => {
          throw new functions.https.HttpsError('unknown', 'ERROR0', { message: error.message } )
      });

    const result2 = await [promise based on result1 goes here]
      .catch(error => {
          throw new functions.https.HttpsError('unknown', 'ERROR1', { message: error.message } )
      });

    const result3 = await [promise based on result1/result2 goes here]
      .catch(error => {
          throw new functions.https.HttpsError('unknown', 'ERROR2', { message: error.message } )
      });

    return {
      success: true
    };
});

最后,不要在任何地方都使用
unknown
,您可以在传递所需的任何支持信息时使用其中一个参数作为第三个参数(如上面我传递原始错误消息的地方所示)。

您能否详细说明“因为firestore和firebase数据库等服务目前没有错误代码…” ... 如果一个人读这样的文件。。。我们似乎看到了关于错误条件的文档。@Kolban总结说,几乎没有正式记录的错误消息,目前只存在于firebase auth on admin中。据我所知,您的问题实际上是关于嵌套承诺,eslint告诉您,在该错误消息中,这是一个糟糕的编程实践。这与错误代码无关。有关首选图案,请参见副本。如果副本没有回答您的问题,请再次询问,说明您尝试了哪些不起作用。@DougStevenson,主要是关于处理错误,以及是否有更好的方法来处理错误。此外,链接的问题甚至没有提到错误,寻找错误处理解决方案的人可能在链接的答案中找不到错误处理解决方案(因为该问题与错误处理无关)。这里被samthecodingman接受的答案,我想说是回答了这个问题,因为它为我提出的错误处理解决方案提供了一个更干净、更好的替代方案。我不明白为什么这个问题被关闭并标记为重复,参考答案与错误处理无关。我已经投票支持重新打开@shmibblest这个看起来更干净的问题,谢谢你的回答