2016-12-22 12 views
0

Firebaseの参照をループしています。それは動作しますが、何らかの理由でforEachループが参照内のオブジェクトよりももう一度実行されます。これにより、Promise.all()関数が失敗し、プロビジョニング全体が失敗します。ここに私のコードです。私はアイデアが何も間違っているんだ。ここでNode.jsでDictionary forEachを呼び出す

return userReceiptMetrics.child(userID).child('postItemIDs').orderByChild('itemID').equalTo(oldProductID).once('value', function(oldSnapshot) { 
      var oldPostItemIDs = []; 
      var metrics = oldSnapshot.val() 

      if (oldSnapshot.val() != null) { 
       return Promise.all(oldSnapshot.forEach(function(record) { 
        console.log(record.val()); 
        var oldKey = record.key; 
        var newKey = oldKey.replace(oldProductID, newProductID); 
        var data = record.val(); 
        oldPostItemIDs.push(oldKey); 
        data.itemID = newProductID; 
        updateObject['userReceiptMetrics/'+userID+'/postItemIDs/'+newKey] = data; 
        updateObject['userReceiptMetrics/'+userID+'/postItemIDs/'+oldKey] = null; 
       })).then(function() { 
        return Promise.all(oldPostItemIDs.map(function(oldPostItemID) { 
         return userReceiptMetrics.child(userID).child('postItems').child(oldPostItemID).then(function(oldPostItem) { 
          var oldKey = oldPostItem.key 
          var newKey = oldKey.replace(oldProductID, newProductID) 
          var data = record.val()       
          updateObject['userReceiptMetrics/'+userID+'/postItems/'+newKey] = data; 
          updateObject['userReceiptMetrics/'+userID+'/postItems/'+oldKey] = null; 

          progress(38); 
         }); 
        })) 
       }).catch(function(error) { 
        console.log('fudge louise'); 
       }); 
      } 
     }); 

は、コンソール出力です:

App listening on port 8080 
Press Ctrl+C to quit. 
FIREBASE WARNING: Using an unspecified index. Consider adding ".indexOn": "_state" at /productUpdateQueue/tasks to your security rules for better performance 
FIREBASE WARNING: Using an unspecified index. Consider adding ".indexOn": "_state" at /productUpdateQueue/tasks to your security rules for better performance 
{ date: '2016-12-21 22:05:03', 
    itemID: 'Macys-EReceipts-MENS HOSIERY-Size(No size provided)-Color(No color provided)-786888403743', 
    postID: '-KZbmaThvxNmrvHwh_mc' } 
{ date: '2016-12-21 22:05:03', 
    itemID: 'Macys-EReceipts-MENS HOSIERY-Size(No size provided)-Color(No color provided)-786888403743', 
    postID: '-KZbxAUcwzcP28C91EZA' } 
FIREBASE WARNING: Using an unspecified index. Consider adding ".indexOn": "itemID" at /userReceiptMetrics/HeQST8hSkoPUmkBiVDR0tpSPo0x2/postItemIDs to your security rules for better performance 
fudge louise 
+0

'forEach'は' undefined' ... 'Promise.all(undefined)'を返します。代わりに 'map'を使用してください。 – elclanrs

+0

コンソールは、.mapがfirebase参照の関数ではないことをコンソールに伝えます。 – WikipediaBrown

+0

'console.log(metrics);の最後の値は何ですか? – Aruna

答えて

0

オブジェクトのリストの最後に空のオブジェクトがあるのでPromise.all()呼び出しが失敗したようなので、それが見えます。ここに訂正されたコードがあります。

return userReceiptMetrics.child(userID).child('postItemIDs').orderByChild('itemID').equalTo(oldProductID).once('value', function(oldSnapshot) { 
      var oldPostItemIDs = []; 
      var metrics = oldSnapshot.val() 

      if (oldSnapshot.val() != null) { 
       return Promise.all(oldSnapshot.forEach(function(record) { 
        console.log(record.val()); 
        var oldKey = record.key; 
        var newKey = oldKey.replace(oldProductID, newProductID); 
        var data = record.val(); 
        oldPostItemIDs.push(oldKey); 
        data.itemID = newProductID; 
        updateObject['userReceiptMetrics/'+userID+'/postItemIDs/'+newKey] = data; 
        updateObject['userReceiptMetrics/'+userID+'/postItemIDs/'+oldKey] = null; 
       })).then(function() { 
        return oldPostItemIDs.map(function(oldPostItemID) { 
         return userReceiptMetrics.child(userID).child('postItems').child(oldPostItemID).then(function(oldPostItem) { 
          var oldKey = oldPostItem.key 
          var newKey = oldKey.replace(oldProductID, newProductID) 
          var data = record.val()       
          updateObject['userReceiptMetrics/'+userID+'/postItems/'+newKey] = data; 
          updateObject['userReceiptMetrics/'+userID+'/postItems/'+oldKey] = null; 

          progress(38); 
         }); 
        }) 
       }).catch(function(error) { 
        console.log('fudge louise'); 
       }); 
      } 
     }); 
関連する問題