从 firebase 可调用函数接收返回的数据

Posted

技术标签:

【中文标题】从 firebase 可调用函数接收返回的数据【英文标题】:Receiving returned data from firebase callable functions 【发布时间】:2018-04-24 13:59:11 【问题描述】:

我正在使用 ios 中的 Callable HTTPS 函数。我已经创建并部署了以下函数:

export const generateLoginToken = functions.https.onCall((data, context) => 

    const uid = data.user_id
    if (!(typeof uid === 'string') || uid.length === 0) 
        throw new functions.https.HttpsError('invalid-argument', 'The function must be called with one argument "user_id" ');
    

    admin.auth().createCustomToken(uid)
    .then((token) => 
        console.log("Did create custom token:", token)
        return  text: "some_data" ;
    ).catch((error) => 
        console.log("Error creating custom token:", error)
        throw new functions.https.HttpsError('internal', 'createCustomToken(uid) has failed for some reason')
    )
)

然后我从我的 iOS 应用程序中调用该函数,如下所示:

let callParameters = ["user_id": userId]
    self?.functions.httpsCallable("generateLoginToken").call(callParameters)  [weak self] (result, error) in
    if let localError = self?.makeCallableFunctionError(error) 
        single(SingleEvent.error(localError))
     else 
        print("Result", result)
        print("data", result?.data)
        if let text = (result?.data as? [String: Any])?["text"] as? String 
            single(SingleEvent.success(text))
         else 
            let error = NSError.init(domain: "CallableFunctionError", code: 3, userInfo: ["info": "didn't find custom access token in the returned result"])
            single(SingleEvent.error(error))
        
    

我可以在日志中看到使用正确参数在服务器上调用了该函数,但我似乎无法获取从该函数返回到应用程序的数据。似乎 result.data 的值是 nil 出于某种原因,即使我 return text: "some_data" 来自云功能。 怎么会?

【问题讨论】:

你能显示你的函数的代码吗? 另外,如果你通过浏览器调用你的函数会得到什么? 你可能在你的函数代码中做错了什么。没有看到它,就没有办法说出来。 对不起.. 我已经添加了云功能:) 这是一个onCall 功能,我不知道如何通过浏览器调用它。当我尝试将 URL 直接粘贴到浏览器中或从终端执行 curl 时,我得到 "error":"status":"INVALID_ARGUMENT","message":"Bad Request" 【参考方案1】:

哎呀!问题是我忘记从云函数返回实际的承诺。此功能有效:

export const generateLoginToken = functions.https.onCall((data, context) => 

    const uid = data.user_id
    if (!(typeof uid === 'string') || uid.length === 0) 
        throw new functions.https.HttpsError('invalid-argument', 'The function must be called with one argument "user_id" ');
    

    return admin.auth().createCustomToken(uid)
    .then((token) => 
        console.log("Did create custom token:", token)
        return  text: "some_data" ;
    ).catch((error) => 
        console.log("Error creating custom token:", error)
        throw new functions.https.HttpsError('internal', 'createCustomToken(uid) has failed for some reason')
    )
)

【讨论】:

感谢您让我仔细检查。供将来参考:在常规回调中返回不起作用。必须使用承诺。 除了在index.js中加入这个函数还有什么额外的步骤吗?我复制了它然后通过终端部署它“firebase deploy”,但我收到这个错误“解析错误:'import'和'export'可能只出现在'sourceType:module'” 嗯.. 是的,还有其他一些步骤。您需要使用您的服务帐户密钥初始化管理 SDK。您可能应该找到有关如何使“createCustomToken”工作的教程。我是这样做的:justpaste.it/57hqz。然后我使用“firebase deploy --only 功能”进行部署。也可以点击这个链接,它应该涵盖基础知识:firebase.google.com/docs/functions/get-started

以上是关于从 firebase 可调用函数接收返回的数据的主要内容,如果未能解决你的问题,请参考以下文章

从android中的firebase函数接收json数据给出空值

从 iOS 应用程序调用时,Firebase 函数返回空值

firebase - 从可调用云函数访问数据库时应用检查失败

Firebase 可调用函数 + CORS

Firebase可调用函数+ CORS

Firebase 可调用函数在 Android SDK 中不返回 JSON 响应