在Google 云函数关于错误报告的文档中,它说"...that某些类型的不透明异常(比如异步抛出的异常)将在未来的函数调用中发生冷启动,这会增加函数运行所需的时间。“
而在有关处理错误的Firebase文档中,它说我们应该“通过抛出(或返回functions.https.HttpsError拒绝的)一个实例来返回可调用的错误.以确保客户端获得有用的错误详细信息”:
if (!(typeof text === 'string') || text.length === 0) {
// Throwing an HttpsError so that the client gets the error details.
throw new functions.https.HttpsError('invalid-argument', 'The function must be called with one arguments "text" containing the message text to add.');
}因此,在我看来,这听起来像是与其他抛出的HttpsError相比,Error被特别对待了。
,我的问题是:是否在可调用的云函数中抛出HttpsError,如上面所示,会导致函数失败,从而导致后续调用的冷启动?
如果是这样的话,抛出HttpsError是没有意义的,就像在这些情况下,函数实例可以而且应该被重用,这类“预期的”错误(比如缺少参数)是没有意义的。
因此,如果是这样的话,最好只返回这样的东西:
return {
error: true,
error_code: 'invalid_argument',
}并在客户机上而不是在HttpsError上处理这个问题。
或者,将错误返回给客户端而不导致函数冷启动的正确解决方案是返回被拒绝的承诺而不是抛出?
if (!(typeof text === 'string') || text.length === 0) {
// Throwing an HttpsError so that the client gets the error details.
return Promise.reject(new functions.https.HttpsError('invalid-argument', 'The function must be called with one arguments "text" containing the message text to add.'));
}根据文档,throw new HttpsError(...)和return Promise.reject(new HttpsError(...))听起来并没有什么区别,但也许我看错了。
发布于 2021-05-26 14:34:42
使用Firebase可调用云函数,通过发回结果或functions.https.HttpsError,您实际上可以向云功能平台指示您的函数已达到其终止状态或状态,并且平台可以关闭运行您的函数的云函数实例。
需要注意的是,我们使用的是can:平台可能会立即关闭实例,也可能不会关闭实例,并让它闲置一段时间。这是你无法控制的。
结果:如果您的云函数的下一次调用发生在实例仍在上时,则将重用该实例,并且不会出现冷启动(如果同一云函数的另一个实例空闲且仍处于运行状态,也会发生相同的调用)。相反,如果实例在下一次调用发生时被关闭(并且没有相同的云函数的其他实例空闲和向上),平台将产生一个新的实例,并且会有一个冷启动。
换句话说,将“查看”这个特定函数的实例,即up 和空闲。如果是,它将使用它,如果不是,它将分拆一个新实例。
结论,在您的例子中,关于如何返回一个像“缺失参数”这样的错误:您可以像在您的问题中那样返回一个对象(或者返回一个承诺,如果该函数实现了一些异步操作,它将与该对象一起解析),或者抛出functions.https.HttpsError的一个实例。这将不会有任何不同的冷开始,见@samthecodingman下面的评论。
请注意关于本文第一句的如下内容:
“发回结果”是指:
“引发functions.https.HttpsError实例”的意思是:
throw new functions.https.HttpsError(...),或;functions.https.HttpsError实例拒绝的承诺。https://stackoverflow.com/questions/67703590
复制相似问题