【问题标题】:Error: You must return a Promise in your transaction()-callback. at transaction.begin.then错误:您必须在您的 transaction()-回调中返回一个 Promise。在 transaction.begin.then
【发布时间】:2019-07-14 01:47:16
【问题描述】:

这是我的代码 sn-p:

await firestore.runTransaction(t => {
        t.get(docRef)
            .then(docRef => {
                logger.info("entering transaction");
                if (!docRef.exists) {
                    t.create(docRef, new Data);
                    return Promise.resolve();
                } else {        
                    t.update(docRef, {aField: updateData});
                    return Promise.resolve();
                }
            })
            .catch(error => {
                return Promise.reject(error);
            });
    })

这给了我以下错误:

Error: You must return a Promise in your transaction()-callback. at transaction.begin.then (/srv/node_modules/@google-cloud/firestore/build/src/index.js:496:32) at <anonymous>

这是我第一次使用 firestore 事务语法,我对 nodejs promise 的概念和语法相当了解。我模仿了firestore事务示例here,并编写了上面的sn-p。

报错后,我尝试将Promise.resolve()改为Promise.resolve(0),但没有成功。

我也尝试删除 await 并改用 .then,但它仍然给我同样的错误。

请给它一些亮点。欣赏它。谢谢。

【问题讨论】:

  • 我知道这不能回答你的问题,但如果其他人在这里是因为他们使用的是 Bluebird 承诺而不是原生承诺,firebase 代码会检查 promise instanceof Promise 并且 Bluebird 承诺将失败那张支票。我不得不用一个原生的承诺来包装我的。

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


【解决方案1】:

您基本上需要return Promise。另外,如果t.createt.update 也返回了一个promise,你可以直接返回它。不要这样做return Promise.resolve(),这是错误的,因为它会在 BEFORE 实际插入或创建之前解决。

假设一切正常,你需要做的:

await firestore.runTransaction(t => {
  return t.get(docRef)
    .then(docRef => {
      logger.info("entering transaction");
      if (!docRef.exists) {
        return t.create(docRef, new Data);
      } else {
        return t.update(docRef, { aField: updateData });
      }
    })
    .catch(error => {
      return Promise.reject(error);
    });
})

【讨论】:

  • 请参阅 Google 文档中的示例。 t.createt.update 返回另一个用于链接目的的交易,而不是承诺。我接受了你的提示,return Promise.resolve() 不起作用,只用Promise.resolve() 替换它。但它不起作用。
【解决方案2】:

回顾这个例子,我意识到我在return t.get() 中错过了return,但是这个错误并不明显可以指出我的错误..

【讨论】:

  • 这就是我在回答的第一行所说的。
  • @AritraChakraborty 我认为您的重点是“不要返回 Promise.resolve(),这是错误的,因为它会在实际插入或创建之前解决。”,实际上是 return Promis.resolve()作品。但是好的,如果您修改该行,我会选择您的答案。
猜你喜欢
  • 2018-07-15
  • 2019-03-04
  • 2020-10-09
  • 2015-10-11
  • 2016-07-21
  • 2021-10-07
  • 2019-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多