从 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数据给出空值