【问题标题】:Cannot save after deleting collection in Firestore Cloud在 Firestore Cloud 中删除集合后无法保存
【发布时间】:2020-09-26 07:36:38
【问题描述】:

我正在使用 Cloud Firestore,但遇到了一个奇怪的问题:删除集合后无法保存。

// DELETE ALL  COLLECTIONS 
const _feedback_delete_all_collections = await deleteAllCollections(user_id);
if(!_feedback_delete_all_collections) return _feedback_delete_all_collections;
            
// START SYNC, STORE AND RFM CALC
return await shopify._start(10, options, user_id);

我用于“deleteAllCollections”Google suggested codes

async function deleteCollection(_collection, _doc_id, _subcollection, batchSize = 50) {
 try {
    const collectionRef = this.db.collection(_collection).doc(_doc_id).collection(_subcollection);
    const query = collectionRef.limit(batchSize);        
    
    return new Promise((resolve, reject) => {
        this.deleteQueryBatch(query, resolve).catch(reject);
    });

  } catch (error) {
    return error;
 }
}

async function deleteQueryBatch(query, resolve) {
  const snapshot = await query.get();

  const batchSize = snapshot.size;
  if (batchSize === 0) {
    // When there are no documents left, we are done
    resolve(true);
  }

  // Delete documents in a batch
  const batch = this.db.batch();
  snapshot.docs.forEach((doc) => {
    batch.delete(doc.ref);
  });
  await batch.commit();

  // Recurse on the next process tick, to avoid
  // exploding the stack.
  process.nextTick(() => {
    deleteQueryBatch(query, resolve);
  });
}

所有代码都按顺序完美运行,所有参考写的反馈是:

WriteResult {
  _writeTime: Timestamp { _seconds: 1601105237, _nanoseconds: 375427000 } }

我正在努力解决这个问题。

有没有人遇到过或者知道怎么解决的?

提前谢谢你!

编辑 - 外壳转储

Server listening on port 3000
---- START IMPORT index.js - _start
_feedback_delete_all_order  true
_feedback_delete_all_XXX  true
_feedback_delete_all_YYY  true
_feedback_delete_all_product  true
_feedback_delete_all_customer  true
---------- Shopify.js - _start 
_saveAllData - START  shopify
Feedback Save Order:  WriteResult {
  _writeTime: Timestamp { _seconds: 1601135004, _nanoseconds: 241293000 } }
Feedback Save Order:  WriteResult {
  _writeTime: Timestamp { _seconds: 1601135004, _nanoseconds: 242116000 } }
Feedback Save Order:  WriteResult {
  _writeTime: Timestamp { _seconds: 1601135004, _nanoseconds: 242197000 } }
Feedback Save Order:  WriteResult {
  _writeTime: Timestamp { _seconds: 1601135004, _nanoseconds: 242888000 } }
Feedback Save Order:  WriteResult {
  _writeTime: Timestamp { _seconds: 1601135004, _nanoseconds: 242988000 } }
Feedback Save Order:  WriteResult {
  _writeTime: Timestamp { _seconds: 1601135004, _nanoseconds: 246281000 } }
Feedback Save Order:  WriteResult {
  _writeTime: Timestamp { _seconds: 1601135004, _nanoseconds: 245678000 } }
Feedback Save Order:  WriteResult {
  _writeTime: Timestamp { _seconds: 1601135004, _nanoseconds: 249575000 } }
Feedback Save Order:  WriteResult {
  _writeTime: Timestamp { _seconds: 1601135004, _nanoseconds: 251043000 } }
Feedback Save Order:  WriteResult {
  _writeTime: Timestamp { _seconds: 1601135004, _nanoseconds: 251268000 } }
_saveAllData - END

【问题讨论】:

    标签: firebase google-cloud-firestore save


    【解决方案1】:

    函数deleteQueryBatch 表示它通过不带任何参数调用resolve() 完成,因此您可以等待它,但它什么也不返回(我们说它返回Promise<void>)。
    要检测 deleteQueryBatch 的成功结束,您应该将其包装在 try/catch 中,如下所示:

    try {
        await deleteAllCollections(user_id);
        return await shopify._start(10, options, user_id);
    }
    catch(error){
        // If deleteAllCollections fails, you will arrive here
        // before executing shopify._start
    }
    

    要了解更多信息,我建议阅读this doc on Promises

    【讨论】:

    • 谢谢!我更新了代码,我看到它是错误的(解决为空)。但是,我尝试了您的代码,但似乎还不行!
    猜你喜欢
    • 2018-03-22
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-08
    • 2020-11-29
    • 2020-11-23
    • 2021-01-08
    相关资源
    最近更新 更多