【问题标题】:Error: You must return a Promise in your transaction()-callback错误:您必须在您的 transaction()-callback 中返回一个 Promise
【发布时间】:2018-07-15 08:56:17
【问题描述】:

我的脚本在返回 assync firestore set 函数的结果时抛出以下错误:

你必须在你的 transaction()-callback 中返回一个 Promise。

根据firebasedocumentation关于事务,set函数返回一个事务本身。

这是我的代码的简化副本。

var myDoc = {
  field1: "v1"
};
var docRef = db
  .collection("docs")
  .doc("1");

return db
  .runTransaction(t => {
    return t
      .set(docRef, chat, {merge:false}); //has i understand, this should return a transaction object but the error says otherwise.
  })
  .then( doc => {
    response.send();
  })
  .catch(err => {
  ...;
  })

我还是 Nodejs 的新手,对链式异步方法不是很熟悉,所以我肯定在这里犯了一些明显的错误。

【问题讨论】:

  • 这可能是关于return t,我对.runTransaction不熟悉,但您可以尝试将return t替换为return new Promise((resolve, reject) => { t.set(...); resolve(); });

标签: javascript node.js firebase es6-promise google-cloud-firestore


【解决方案1】:

这样做:

return db
  .runTransaction(t => {
      t.set(docRef, chat, {merge:false}); 
      return Promise.resolve(); // Add this line.
  })
  .then( doc => {
     response.send();
  })
  .catch(err => {
     ...;
  })

如果t.set() 失败,它也不会转到resolve()

【讨论】:

    【解决方案2】:

    没有使用 firestore 事务,但我使用了 firebase 事务。您可以尝试关注

    return db
      .runTransaction(t => {
        return t.set(docRef, chat, {merge:false})
          .then(data => {
            return Promise.resolve('transaction complete');       
          })
          .then( doc => {
            response.send();
          })
          .catch(err => {
            ...;
          })
    

    并且包含你的整个代码的方法必须返回你写的承诺return db.runTransaction(t => {....}) 因此,如果不需要,请使用

    var transaction = db.runTransaction(t => {...});

    【讨论】:

    • 如果我理解正确的话,它确实消除了错误,但不要缝合等待设置的结果。
    • 更新的答案尝试一下,但这不应该发生,稍后再试。
    • 随着更新我得到了错误:TypeError: t.set(...).then is not a function 看来 set 没有返回承诺。如果我调试到 set 函数,我看到它返回这个,事务。错误令人困惑。我的猜测是我不需要在事务中链接响应,只需将几个回调传递给事务,服务器就会一个接一个地运行。
    • 当你要set()的文件可能在这个过程中发生变化时,你需要一个事务。所以一个典型的交易会从一个 get() 开始,它返回一个你可以附加你的集合操作的承诺。
    猜你喜欢
    • 1970-01-01
    • 2019-03-04
    • 1970-01-01
    • 2020-10-09
    • 2015-10-11
    • 2016-07-21
    • 1970-01-01
    • 2015-06-22
    • 2015-10-10
    相关资源
    最近更新 更多