node.js - 适用于 Firebase 的 ESOCKETTIMEDOUT 云函数

标签 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 表包含大约 50k 条目。

最佳答案

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

编辑:您返回“writeSuggestedCars”,但我认为它永远不会返回值。我没有编译器,但我认为它是 return 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)
             });
        }
    });
}

关于node.js - 适用于 Firebase 的 ESOCKETTIMEDOUT 云函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46169527/

相关文章:

javascript - 对于在 NodeJS 中遍历数组但 console.log 不会打印到终端的循环?

java - 如何按降序从 Firebase 数据库中检索数据?

java - Firebase - 检查 Posts 节点中的 uid 子值是否匹配,如果匹配则将所有分数值加在一起并存储在 String 变量中

java - 如何从 Firebase 检索不同对象类型的列表?

javascript - fs.writeFileSync 写入空白文件

javascript - 无法将获取的数据发送到我的 socket.io 流?

Node.js - 结合 IBM Watson Discovery 和 Conversation Services

java - 在 firebase 实时数据库中保存子类

ios - 除非用户登录,否则无法从Firebase检索数据

javascript - 设置状态后如何避免高估项目?