在 Firebase Cloud Function 上抛出新函数。 https.HttpsError 被拒绝为客户端上的内部错误

Posted

技术标签:

【中文标题】在 Firebase Cloud Function 上抛出新函数。 https.HttpsError 被拒绝为客户端上的内部错误【英文标题】:Throwing new functions.https.HttpsError on Firebase Cloud Function rejects as Internal Error on Client 【发布时间】:2018-11-28 21:22:50 【问题描述】:

我将以下 Cloud Function 部署到我的 Firebase 项目:

exports.createCredentials = functions.https.onCall((data, context) => 
    if(!context.auth)
        throw new functions.https.HttpsError('failed-auth', 'You must be authenticated to call this function')

    const  email, password  = data;

    if(!(typeof email === 'string'))
        throw new functions.https.HttpsError('invalid-email', 'Email must be a string')
    if(!(typeof password === 'string'))
        throw new functions.https.HttpsError('invalid-password', 'Password must be a string')

    return admin.auth().createUser(
        email,
        password
    )
    .then(userRecord => 
        return  userRecord 
    )
    .catch((error) =>  
        throw new functions.https.HttpsError(error.code, error.message)
    )
)

问题是,每当我抛出一个新的functions.https.HttpsError 而不是在客户端中将错误捕获为docs 状态时,我都会得到一个internal 错误代码。在我的函数日志中,它显示了一个未处理的错误,我尝试调用 HttpsError。以下是日志示例:

Unhandled error Error: Unknown error status: auth/email-already-exists
    at new HttpsError (/user_code/node_modules/firebase-functions/lib/providers/https.js:80:19)
    at admin.auth.createUser.then.catch (/user_code/index.js:26:9)
    at process._tickDomainCallback (internal/process/next_tick.js:135:7)

我知道如果没有抛出 HttpsError,这种类型的函数会拒绝内部错误,但据我所知,我的函数并非如此。我在 React 中对前端进行编程,所以这就是我如何调用这个 firebase 函数:

let options = 
    email: arquitect.email,
    password: arquitect.password


let createCredentials = firebase.functions().httpsCallable('createCredentials')
createCredentials(options)
    .then(result => 

    )
    .catch(error => console.log(error))

我有什么遗漏吗?

【问题讨论】:

我也有同样的情况。你发现了吗? 我没有......当出现问题时,我没有抛出 HttpError,而是返回了一个错误对象。这有点不方便,因为您必须在客户端上进行检查,但它可以工作 【参考方案1】:

根据您链接的文档,您似乎没有使用值 listed here 作为 code 参数。该值必须是 Google API 的规范错误代码之一。例如,“failed-auth”或“invalid-email”未在此处列出。您可以改用“permission-denied”或“invalid-argument”。

【讨论】:

这个答案也帮助我解决了我的问题。我认为文档页面已更改(此答案中的链接现在将您带到 404 页面)。这是截至今天的文档——firebase.google.com/docs/reference/functions/… 你是对的。感谢您的提醒。我已经用那个正确的链接更新了我的答案。 又是404。也许这是页面? firebase.google.com/docs/reference/js/… @Chris Chiasson,谢谢。我已经更新了链接。【参考方案2】:

我自己的问题只是 ctheprinter 所说的区域

完整的工作示例:

const firebaseFunctions = require('firebase-functions');
const functions = firebaseFunctions.region("europe-west1");

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

    if(!context.auth)
        throw new firebaseFunctions.https.HttpsError('failed-auth', 'You must be authenticated to call this function')

)

【讨论】:

【参考方案3】:

我有同样的问题。新手,所以我的尝试可能是错误的,但我在本地调用函数,无法访问HttpsError

所以在执行以下操作时:

const functionsGlobal = require('firebase-functions')
const functions = functionsGlobal.region('europe-west2')

然后我必须像这样获得HttpsError

throw new functionsGlobal.https.HttpsError('failed-precondition',
    'The function must be called while authenticated.', 'hello')

代替:

throw new functions.https.HttpsError('failed-precondition', 
    'The function must be called while authenticated.', 'hello')

它现在有效,但我希望有人解释原因。

【讨论】:

以上是关于在 Firebase Cloud Function 上抛出新函数。 https.HttpsError 被拒绝为客户端上的内部错误的主要内容,如果未能解决你的问题,请参考以下文章

在 TypeScript 中为 Firebase Cloud Function 配置 mailgun

在 Firebase Cloud Function 中发出 Youtube Data API 请求

从请求中获取用户信息到 Firebase 中的 Cloud Function

Firebase:Firestore 未在 Cloud Function 的计划函数中更新数据

Firebase Cloud Function在特定时间后自动删除数据[重复]

Firebase Cloud Function 在 .get() 完成之前结束