在Firebase Cloud中返回什么功能有两个或多个返回承诺的方法?

时间:2018-01-20 19:21:38

标签: javascript node.js firebase google-cloud-functions

我有一个云函数,可以监听Firebase Database中的更改,并使用返回promise的函数进行响应。

exports.clean_up_anonymous_users =
  functions.database.ref('path/to/ref')
  .onWrite(event => {

    // Make Sure it's not a delete event
    if (!event.data.val()) {
      return 0;
    }

    const cleanUp = event.data.val();

    // Normal Boolean check of my value
    if (cleanUp === true) {

      // Deletes Anonymous Users (returns a promise)
      listAllUsers();

      // Removes the value from the Database (returns a promise)
      return removeFromQueue("path/to/ref");

    }

    // If cleanUp === false
    return 0;
  });

// ===============================================
// I think that's enough but if you wish, read on!
// ===============================================

function listAllUsers(nextPageToken) {
  // List batch of users, 1000 at a time.
  admin.auth().listUsers(1000, nextPageToken)
    .then(function(listUsersResult) {
      listUsersResult.users.forEach(function(userRecord) {
        var userInfo = userRecord.providerData;
        if (userInfo.length === 0) {
          var uid = userRecord.uid;
          admin.auth().deleteUser(uid)
            .then(function() {
              console.log("Successfully deleted user:", uid);
            })
            .catch(function(error) {
              console.log("Error deleting user:", error);
            });
        }
      });
      if (listUsersResult.pageToken) {
        // List next batch of users.
        listAllUsers(listUsersResult.pageToken);
      }
    })
    .catch(function(error) {
      console.log("Error listing users:", error);
    });
}

function removeFromQueue(path) {
  admin.database().ref(path).remove()
  .then(function() {
    console.log("Remove succeeded.")
  })
  .catch(function(error) {
    console.log("Remove failed: " + error.message)
  });
}

此代码按预期工作,但在“日志”窗口中显示错误:

  

错误:函数返回未定义,预期的Promise或值

如何摆脱那个错误?

1 个答案:

答案 0 :(得分:2)

最后定义的两个函数确实返回undefined,因为它们不是return任何东西。这可以在Ruby中使用,函数体中的最后一个解释行是return ed。

所以在这些函数内部的函数开始之前添加return,你正在使用Promise链,它将返回Promise,因为它们的执行将完成。

所以在你的代码中会有这样的:

return admin.auth()...

并且

return admin.database()...