错误:您必须在transaction()回调中返回Promise。在transaction.begin.then

时间:2019-07-13 06:55:11

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

这是我的代码段:

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事务语法,并且我对Node.js Promise概念和语法相当了解。我模仿了Firestore交易示例here并编写了以上代码段。

发生错误后,我尝试将Promise.resolve()更改为Promise.resolve(0),但徒劳。

我还尝试删除await,而改用.then,但这仍然给我同样的错误。

请点亮一些灯光。欣赏它。谢谢。

2 个答案:

答案 0 :(得分:1)

您基本上需要return这个承诺。另外,如果t.createt.update也返回了一个承诺,则可以将其返回。不要执行return Promise.resolve(),这是错误的,因为它会在实际插入或创建之前之前解决。

假设一切正常,您需要执行以下操作:

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);
    });
})

答案 1 :(得分:0)

回顾示例,我意识到我错过了return中的return t.get(),但是指出这一错误绝不是显而易见的错误。