Firebase 函数返回和承诺不会退出函数

2024-03-17

我仍然是 Firebase 世界的初学者,我一直在尝试找出以下代码的问题所在,但我在所有可能的方面都失败了。

该代码应该检索uid来自数据库中的用户配置文件,然后使用它来更新身份验证配置文件,如果身份验证配置文件更新成功,则再次更新数据库配置文件。

In index.js我定义了一个导出函数来处理 HTML 表单中的 POSTed 参数。下面的代码在另一个模块文件中定义了处理函数:

 exports.auUpdateUserByEmail = (req, res) => {
  // This handler function will retrieve the POSTed params of user profile
  // and will attempt to update the existing user authentication as well as
  // the database profiles.
  //
  // This function accepts the following params:
  // 1. User email   // 2. Phone number   // 3. password   // 4. Display name
  // 5. Photo url   // 6. Disabled Flag
  //

  var db = admin.firestore();

  var uEmail = req.body.userEmail;
  var dName = req.body.displayName;
  var userId = "";

  var newuser = {
    displayName: dName
  }

  console.log("Email passed: " + uEmail);

  // Fetch the user UID by user email...
  res.write('User UID: ' + userId);
  console.log('User UID: ' + userId);

  // attempt to update the user authentication profile...
  return db.collection('Users').where('email', '==', email).get()
  .then(snapshot => {
    snapshot.forEach(doc => {
        var d = doc.data();
        console.log("doc.id: " + doc.id + " - d.email: " + d.email);
        if(d.email == email)
        {
          userId = d.uid;
        }
    });

    return admin.auth().updateUser(userId, newuser);
  }).then(function(userRecord) {
    // The updating was successful... Attempt to update User Details in
    // database User Profile...
    console.log("User Updated Successfully. UID: " + userRecord.uid);
    retUid = userRecord.uid;

    // Create a reference to the Users Database...
    var docRef = db.collection('Users');

    // Update the user profile document.
    return docRef.doc(userRecord.uid).update(newuser);
  }).then(result => {
    // everything went fine... return User UID as a successful result...
    res.write(userId);

    return res.end();

  }).catch(function(error) {
    console.log("doc.update - Error updating user profile in database:", error);
    return res.end();

  });
}

In index.js,我有以下导出定义:

var appAuth = express();
//Here we are configuring express to use body-parser as middle-ware.
appAuth.use(bodyParser.urlencoded({ extended: false }));
appAuth.use(bodyParser.json());

appAuth.post('/updateUserByEmail', authusers.auUpdateUserByEmail);

exports.usersAuthFunctions = functions.https.onRequest(appAuth);

我不得不说我让它工作得很好以获得uid,更新身份验证配置文件,然后更新数据库配置文件,但它一直等待函数返回。

感谢您的宝贵帮助。谢谢。


我已经更新了代码,如下所示,它完成了工作,但在承诺完成之前返回一个空白页面,因为 HTTPS 退出了“错误:在结束后写入” error.

var fetch_uid = db.collection('Users').where('email', '==', uEmail).get()
  .then(snapshot => {
    // var userId = snapshot.data.uid;

    snapshot.forEach(doc => {
        var d = doc.data();
        console.log("doc.id: " + doc.id + " - d.email: " + d.email);
        if(d.email == uEmail)
        {
          userId = d.uid;

          res.write('User UID: ' + userId);
          console.log('User UID: ' + userId);

        }
    });

    return admin.auth().updateUser(userId, newuser);
  }).then(function(userRecord) {
    // The updating was successful... Attempt to update User Details in
    // database User Profile...
    console.log("User Updated Successfully. UID: " + userRecord.uid);
    retUid = userRecord.uid;

    // Create a reference to the Users Database...
    var docRef = db.collection('Users');

    // Update the user profile document.
    return docRef.doc(userRecord.uid).update(newuser);
  }).then(result => {
    // everything went fine... return User UID as a successful result...
    res.write(userId);

    return;

  }).catch(function(error) {
    console.log("doc.update - Error updating user profile in database:", error);
    return;

  });

  res.end();

我之前的一个回答Firebase HTTP 超时的云功能 https://stackoverflow.com/a/47155902/2754146在这里可能有帮助:

由 HTTP 请求触发的 Cloud Functions 需要通过以下方式终止 结束他们send(), redirect(), or end(),否则他们 将继续运行并达到超时。

从您的代码示例来看,它看起来像您的then(){}承诺回报以res.end(),但整个函数返回Promise from:

return db.collection('Users').where('email', '==', email).get()

这可能会阻止它在你想要的时候结束。使用 HTTPS 触发器,您不需要返回Promise要保持函数运行,只有一个结果。

尝试从这一行删除 return 语句:

db.collection('Users').where('email', '==', email).get()

然后你只需要确保所有出口路线(或终止点)都以res.end()或类似的,所以目前你有 2 个终止点:

  }).then(result => {
    // everything went fine... return User UID as a successful result...
    res.write(userId);

    res.status(200).end();
  }).catch(function(error) {
    console.log("doc.update - Error updating user profile in database:", error);

    res.status(500).end();
  });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Firebase 函数返回和承诺不会退出函数 的相关文章

随机推荐

  • 为什么记录类型定义中不允许使用灵活类型?

    我正在尝试这个 type TS1 lt state action gt actions state gt seq lt action gt move state gt action gt state state0 state 但类型检查器不
  • JobIntentService 和 IntentService 有什么区别?

    我不明白这两个 API 之间有什么区别 我的意思是何时使用第一个 为什么会有 JobIntentService 提前致谢 我建议阅读这篇文章 解释两者之间的区别意向服务和求职意向服务 https medium com hupareshubh
  • 如何设置休眠sql_mode

    有没有办法在 Hibernate 属性或连接字符串中设置 sql mode 对于 MySql 数据库 Thanks Stefano Yes as 有记录的 https dev mysql com doc connector j 5 1 en
  • .htaccess 重定向文件夹

    All 我想重定向所有访问的流量http 我的网站 http mysite to http mysite public http mysite public文件夹 目前我正在 htaccess 文件中使用以下内容来执行此操作 它适用于根目录
  • 在python中读取.dat文件

    我有一个 dat 文件 我不知道它是如何创建的 使用了什么分隔符以及有关它的任何详细信息 我只有相应的 mdf 和 csv 文件 就这样 python 有什么方法可以读取这个 dat 文件吗 我尝试过的几种方法 file 736 2 Per
  • Bash 中的 Echo 换行符打印文字 \n

    如何打印换行符 这仅仅打印 n echo e Hello nWorld Hello nWorld Use printf反而 printf hello nworld n printf在不同环境下的行为比echo
  • 我可以在 mongodb 的 $match 聚合函数中使用 $in 吗

    我试图在 match 聚合 函数中使用 in 运算符 由于某种原因 它不适用于 Id 字段 但我找不到任何文档指出 mongodb 不支持此功能 var ids 1 2 3 4 an example I am using real mong
  • Django 聚合:仅求和返回值?

    我有一个已付价值列表 并想显示已付总额 我已经使用了聚合和Sum一起计算值 问题是 我只想打印出总值 但聚合打印出 amount sum 480 0 480 0 为总增加值 在我看来 我有 from django db models imp
  • Kafka 一个分区有多个消费者

    我有一个将消息写入主题 分区的生产者 为了保持顺序 我想使用单个分区 并且我希望 12 个消费者读取该单个分区中的所有消息 没有消费者组 所有消息都应该发送给所有消费者 这是可以实现的吗 我读过一些论坛 每个分区只有一个消费者可以阅读 您可
  • 查找最长可能重复字符串的实用程序

    是否有任何工具或实用程序或 perl python 脚本可以在大型文本文件中找到最长的重复子字符串并打印这些模式以及每个模式出现的次数 http en wikipedia org wiki Longest repeated substrin
  • 如何从某个数字/偏移量开始自动增量?

    我正在运行 fgetcsv 查询以将一堆数据从 CSV 导入 WordPress 我想知道如何从某个数字开始自动递增 例如从 1000 开始 import1 INSERT into wp postmeta meta id post id m
  • Java 7 和 Java 8 之间的舍入不一致是一个错误吗?

    我发现舍入不一致DecimalFormat http docs oracle com javase 8 docs api java text DecimalFormat htmljava 7 和 java 8 之间的类 这是我的测试用例 D
  • 如果堆栈在数字较低的地址处增长,为什么指针比较会颠倒这一点?

    由于堆栈向下增长 即朝着数值较小的内存地址增长 为什么 i lt j是真的 如果我错了 请纠正我 但我想这是 C 创建者 C 维护的 的设计决定 但我想知道为什么 同样奇怪的是 堆分配的对象pin位于比堆栈变量在数值上更高的内存地址 这也与
  • 为什么在手动刷新响应时 ASP.NET 将 Content-Length 标头替换为 Transfer-Encoding 标头?

    我们的 Web 应用程序 ASP NET Web Forms 有一个页面 将向用户显示最近生成的 PDF 文件 由于 PDF 文件有时非常大 因此我们实现了一种 流式传输 方法 将其分块发送到客户端浏览器 尽管以块的形式发送数据 但我们在发
  • 使用 Cython 进行部分构建的构建

    我在构建中面临 cython 的问题 其中一部分是使用 cython 构建的模块 c文件和一个 pyx file 我已经尝试了很多解决方案 Sean Gillies 博客 814 将 pyproj 添加到构建中 http sgillies
  • (解)压缩 Base64 字符串

    PHP代码 txt John has cat and dog plain text txt base64 encode txt base64 encode txt gzdeflate txt 9 best compress txt base
  • Minecraft Forge EntityJoinWorldEvent 返回错误位置!错误

    在本地开发环境中使用 Eclipse Mars 1 Release 4 5 1 中的 Forge 1 8 9 I m trying to set a player s location every time they join or re
  • React:如何将道具从孩子传递到父母再到另一个孩子?

    我这里有一个简单的设置 我有一个父组件 其中有 2 个子组件附加到该父组件 在第一个子组件中 用户更改输入的值 然后 该更改的值将是我想从该子组件传递到父组件的道具 以便可以将其传递给附加到同一父组件的另一个子组件 Main parent
  • 如何在 Scrutor 中注册组件上的所有接口(类似 StructureMap)

    如何在程序集中注册所有接口scan扩展名没有在 ASP NET Core 2 中全部分开写入 在结构图中 Scan gt Declare which assemblies to scan Assembly StructureMap Test
  • Firebase 函数返回和承诺不会退出函数

    我仍然是 Firebase 世界的初学者 我一直在尝试找出以下代码的问题所在 但我在所有可能的方面都失败了 该代码应该检索uid来自数据库中的用户配置文件 然后使用它来更新身份验证配置文件 如果身份验证配置文件更新成功 则再次更新数据库配置