【问题标题】:How to use promise in an argument function (Firebase transaction)?如何在参数函数(Firebase 事务)中使用 Promise?
【发布时间】:2017-09-18 20:42:13
【问题描述】:

Firebase transaction 接收第一个参数作为函数(任何类型)。我可以在这个函数中使用返回 promise 的方法吗? (在我的例子中是firebase-admin.auth().createUser())。

为了清楚起见,一些代码:

const ref = admin.database().ref(...);
ref.transaction((currentData) => {
  if (currentData === null && ...) {
    admin
      .auth()
      .createUser({...})
      .then(data => return { uid: data.uid }) // Need to return this 'someData' from function that wraps current promise.
      .catch(() => return null)
  } else {
    return null
  }
});

在这段代码中,函数无需等待 promise 被解析即可运行。

NodeJS v.6.11.1(谷歌云函数)

谢谢!

更新: 我希望只有在 promise 没有错误地解决(即达到then)时才从这个参数函数返回数据,因此只有在用户创建时才应用事务。

【问题讨论】:

  • someData 是在哪里定义的?为什么在箭头函数中 .then() 中使用 return 而没有 {}?您是否希望通过if (validateUserData(req.body)) {}validateUserData 调用返回PromiseBoolean
  • 您好,@guest271314!对不起,我对示例代码太抽象了。将其更改为更接近真实。 pastebin 代码中的 validateUserData 应该返回 Boolean
  • 目前validateUserData() 返回一个Promise,是吗?您是否考虑在 OP 的链接 pastebin 中包含代码并指出预期结果是什么?
  • @guest271314 对不起,pastebin 中的这段代码没有经过充分测试,你是对的,它返回未解决的承诺,总是评估为真。非常感谢!

标签: javascript node.js firebase firebase-realtime-database google-cloud-functions


【解决方案1】:

Promise 不能在事务处理程序中使用。事务处理程序需要立即在事务位置返回数据库的新内容。

transaction() 的调用本身会返回一个promise,因此如果您想在事务成功后做某事,您可以在该promise(包含事务的成功状态)上使用then() 并跟进一些也可以从那里返回承诺的其他操作。

现在,您似乎根本没有对事务中的数据库进行任何更改,所以我很好奇您为什么还要使用一个。

【讨论】:

  • .then(data => return { uid: data.uid }) 我只想在 createUser 成功的情况下创建 /users/{username}。试图解决这个问题stackoverflow.com/questions/46252458
  • const userRef = admin.database().ref(`users/${req.body.username}`)
  • 您的事件顺序倒退了。只有在创建新用户时,您才应该使用身份验证触发器在数据库中执行操作。 firebase.google.com/docs/functions/auth-events
  • 但是我怎样才能提供用户在电子邮件旁边的输入字段中输入的用户名和密码到这种类型的功能?
  • 请阅读我链接到的文档,并可能根据您使用身份验证触发器而不是数据库触发器提出不同的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-18
  • 1970-01-01
  • 1970-01-01
  • 2019-09-14
  • 2020-11-09
  • 2018-01-21
  • 2016-11-18
相关资源
最近更新 更多