在Firebase云函数中使用getUserByEmail
在Firebase云函数中使用getUserByEmail
在我正在开发的Firebase Web应用中,我想通过邮件地址获取用户ID。为此,我正在尝试编写一个云函数。但是它不起作用,或者我没有正确使用它。以下是当前的代码(基于我在网上找到的一些示例):\n
"use strict"; import * as functions from "firebase-functions"; import * as admin from "firebase-admin"; admin.initializeApp(functions.config().firebase); exports.myFunc = functions.https.onRequest(function(req, resp) { const from = req.body.sender; admin.auth().getUserByEmail(from) .then(function(userRecord) { console.log("Successfully fetched user data:", userRecord.toJSON()); }) .catch(function(error) { console.log("Error fetching user data:", error); }); });
\n当运行\"firebase deploy\"时,我看不出任何问题。\n然后,我尝试以各种方式测试该函数,就像我根据这个教程编写的演示应用程序一样。\n例如(使用已存在和不存在的邮件地址):\nhttps://us-central1-myapp.cloudfunctions.net/myFunc\nhttps://us-central1-myapp.cloudfunctions.net/myFunc?from=abcd@xyz.com\n
\n但无论哪种情况,我在Web控制台中都没有看到任何内容,浏览器中显示以下内容:\nError: could not handle the request\n
\n希望有经验的Firebase云函数用户给出一些建议。\n实际上,最好有一些教程,并附带示例代码,展示如何在Firebase云函数中使用getUserByEmail函数。\n..... 在进一步调查后,这里有一些额外的信息 .....\n当使用以下代码时:\n
const from = req.body.sender; admin.auth().getUserByEmail(from)
\n我在日志中得到以下错误:\nError fetching user data: FirebaseAuthError: The email address is improperly formatted.\n
\n当使用以下代码之一时:\n
admin.auth().getUserByEmail("fakemail@example.com") admin.auth().getUserByEmail("realmail@example.com")
\n我在日志中得到预期的结果:\n对于第一行(使用虚假邮件):\nError fetching user data: FirebaseAuthError: There is no user record corresponding to the provided identifier.\n
\n对于第二行(使用实际存在的邮件):\nSuccessfully fetched user data: {\n2022-01-22T07:25:04.946Z ? myFunc: uid: \'yfC123abc....\',\n2022-01-22T07:25:04.946Z ? myFunc: email: \'realmail@example.com\',\n.....\n}\n
\n我需要知道如何使此函数正确接受一个参数(称为from或其他名称),并且还需要知道如何从我的原始Web应用程序中使用该函数。\n... 在进行了一些尝试和错误后,还有更多的代码 ...\n这里是一段新的代码,显示了我当前的问题:\n
const from = req.query.from; // 下面的两行产生了预期的结果。 // 即作为参数传递的邮件地址。 console.log("from(CL):", from); functions.logger.log("from(FL):", from); admin.auth().getUserByEmail(from) .then(function(userRecord) {
\n当在getUserByEmail调用的那行运行firebase deploy时,我收到一个错误消息,该错误消息说:\nsrc/index.ts:37:33 - error TS2345: Argument of type \'string | string[] | ParsedQs | ParsedQs[] | undefined\' is not assignable to parameter of type \'string\'.\n Type \'undefined\' is not assignable to type \'string\'.\n37 admin.auth().getUserByEmail(from)\n ~~~~\n
\n请问getUserByEmail调用的正确语法是什么。
问题的原因是在云函数中使用getUserByEmail函数时无法使用通过req.query.from传递的信息。解决方法是使用req.query.from来获取传递的值,并将其传递给getUserByEmail函数。
以下是整理后的
问题似乎出在req.body
...
在将输入作为查询字符串传递时:?from=abcd.com
。
我假设req.query.from
应该在设置时携带一个值。
那么代码应该是什么呢?"const from = req.query.from;"?但它似乎不起作用。能够在我的Web应用中使用该函数才是重要的事情。"...?from=abcd.com"只是一种我自己编造的测试方法。
那我怎么知道你的Web应用在做什么?问题中没有涉及的内容通常是无关紧要的。你可以使用req.body.from
,同时使用POST
而不是GET
动词。
我可以提供任何所需的信息。但我认为我的页面在做什么并不重要。对于这个问题来说,唯一相关的是需要调用这个函数(myFunc),提供一个给定的邮件地址,并得到相应的用户ID。这正是我不知道如何做到的地方。
使用req.query.from(如你所建议的)确实可以得到一些结果,但出于某种原因我无法使用通过req.query.from传递的信息来填充getUserByEmail,请参阅我刚刚添加到帖子末尾的部分。
问题的出现原因是需要将req.query.from转换为字符串,而不是直接使用原始的req.query.from值。这是因为在使用getUserByEmail函数时,它需要接收一个字符串类型的参数作为用户的电子邮件地址。
解决方法是使用String()函数将req.query.from转换为字符串类型的值,然后将其传递给getUserByEmail函数作为参数。这样可以确保getUserByEmail函数能够正确地处理用户的电子邮件地址。
以下是修改后的代码示例:
const from = String(req.query.from);
相比之前的代码:
const from = req.query.from;
通过使用String()函数,我们可以确保从req.query.from获取的值始终是一个字符串,以满足getUserByEmail函数的要求。这样可以避免由于参数类型不匹配而导致的错误。