1

私は、Firebaseのクラウド機能をFirebaseリアルタイムデータベースとともに使用して、アプリのデータ管理を行っています。ESOCKETTIMEDOUT Firebaseのクラウド機能

私の機能の1つは完了するのに約100-150秒かかるので、終了するようです。これはエラー:ESOCKETTIMEDOUTで発生します。

これを防ぐ方法はありますか?ユーザーが好みを追加したとき

function getTopCarsForUserWithPreferences(userId, genres) { 
    const pathToCars = admin.database().ref('cars'); 

    pathTocars.orderByChild("IsTop").equalTo(true).once("value").then(function(snapshot) { 
     return writeSuggestedCars(userId, genres, snapshot); 
    }).catch(reason => { 
    console.log(reason) 
    }) 
} 

function writeSuggestedCars(userId, genres, snapshot) { 
    const carsToWrite = {}; 
    var snapCount = 0 
    snapshot.forEach(function(carSnapshot) { 
     snapCount += 1 
     const carDict = carSnapshot.val(); 
     const carGenres = carDict.taCarGenre; 
     const genre_one = genres[0]; 
     const genre_two = genres[1]; 

     if (carGenres[genre_one] === true ||carGenres[genre_two] == true) { 
      carsToWrite[carSnapshot.key] = carDict 
    } 

     if (snapshot.numChildren() - 1 == snapCount) { 
      const pathToSuggest = admin.database().ref('carsSuggested').child(userId); 
      pathToSuggest.set(carsToWrite).then(snap => { 

      }).catch(reason => { 
      console.log(reason) 
      }); 
     } 
    }); 
} 

getTopCarsForUserWithPreferencesが呼び出されます:

は、ここに私の関数です。また、carsテーブルには約50,000のエントリがあります。

答えて

1

非同期タスクを使用するたびに返す必要があります。

編集:あなたは 'writeSuggestedCars'を返しますが、決して値を返すとは思いません。コンパイラはありませんが、Promise.resolved()を返すと思いました。私はここに 'put'を挿入することができますか?

多分これは動作します:

function getTopCarsForUserWithPreferences(userId, genres) { 
    const pathToCars = admin.database().ref('cars'); 

    return pathTocars.orderByChild("IsTop").equalTo(true).once("value").then(function(snapshot) { 
     return writeSuggestedCars(userId, genres, snapshot); 
    }).catch(reason => { 
    console.log(reason) 
    }) 
} 

function writeSuggestedCars(userId, genres, snapshot) { 
    const carsToWrite = {}; 
    var snapCount = 0 
    snapshot.forEach(function(carSnapshot) { 
     snapCount += 1 
     const carDict = carSnapshot.val(); 
     const carGenres = carDict.taCarGenre; 
     const genre_one = genres[0]; 
     const genre_two = genres[1]; 

     if (carGenres[genre_one] === true ||carGenres[genre_two] == true) { 
      carsToWrite[carSnapshot.key] = carDict 
    } 

     if (snapshot.numChildren() - 1 == snapCount) { 
      const pathToSuggest = admin.database().ref('carsSuggested').child(userId); 
      return pathToSuggest.set(carsToWrite).then(snap => { 
       // 'HERE' I think return promise/Promise.resolve() will work 
      }).catch(reason => { 
      console.log(reason) 
      }); 
     } 
    }); 
} 
関連する問題