ESOCKETTIMEDOUT Firebase的云功能

时间:2017-09-12 06:37:06

标签: node.js firebase firebase-realtime-database google-cloud-functions

我正在使用Cloud Functions for Firebase以及我的Firebase实时数据库,以便为我的应用程序进行一些数据管理。

我的一个功能虽然似乎被终止,因为它需要大约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 个答案:

答案 0 :(得分:2)

每次使用异步任务时都需要返回。

编辑:你返回' writeSuggestedCars'但我认为它永远不会带来价值。我没有编译器,但我认为它是返回Promise.resolved()。你可以把它插入我推荐的地方吗?

;

也许这会奏效:

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