错误:您必须在事务()中返回Promise - 回调

时间:2018-02-05 13:27:05

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

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

  

您必须在交易中回复承诺() - 回调。

根据firebase documentation关于事务,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的新手,对链接assyncs方法不太熟悉,所以我必须在这里做一些明显的错误。

2 个答案:

答案 0 :(得分:1)

没有使用过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 => {...});

答案 1 :(得分:0)

只需执行以下操作:

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()