Firebase admin.auth().getUser(uid) 挂起 (NodeJS)

Firebase admin.auth().getUser(uid) hangs (NodeJS)

我在无服务器项目的 Firebase Admin SDK (NodeJS) 中使用 admin.auth().getUser(uid),它成功地 return 结果。但是即使我的函数 returns 结果,我的 lambda 仍然没有终止,我必须使用 CTRL+C 来结束它。

这是我的函数的完整代码(在 TypeScript 中):

public getUser(uid: string): any {
  console.log('FirebaseManager getUser method start');
  const self: FirebaseManager = this;
  const promise: any = self.getDeferred();

  admin.auth().getUser(uid)
  .then(function(userRecord: admin.auth.UserRecord) {
    console.log("Successfully fetched user data:", userRecord);
    promise.resolve(userRecord);
  })
  .catch(function(error: FirebaseError) {
    console.log("Error fetching user data:", error.errorInfo);
    promise.reject('Error getting Firebase user ' + uid);
  });

  return promise.promise;
}

我做错了什么吗?

请注意,如果我注释掉 admin.auth().getUser(uid) 块(并将其替换为 promise.resolve("ok")),我的函数会正确终止。我的意思是,这并没有挂起(但是有点没用^^):

public getUser(uid: string): any {
  console.log('FirebaseManager getUser method start');
  const self: FirebaseManager = this;
  const promise: any = self.getDeferred();

  promise.resolve("ok");

  return promise.promise;
}

我正在使用 Serverless 1.21.1、Typescript 2.5.2、Node 6.11.3 或 8.4.0(2 个不同的开发环境,结果相同)

显然,您需要 运行 admin.app().delete();,否则与 Firebase 的连接将保持活动状态,从而阻止进程终止。

因此在我的示例代码中,考虑到在 运行 启用此功能后我将不再需要使用 Firebase:

public getUser(uid: string): any {
  console.log('FirebaseManager getUser method start');
  const self: FirebaseManager = this;
  const promise: any = self.getDeferred();

  admin.auth().getUser(uid)
  .then(function(userRecord: admin.auth.UserRecord) {
    console.log("Successfully fetched user data:", userRecord);
    admin.app().delete();
    promise.resolve(userRecord);
  })
  .catch(function(error: FirebaseError) {
    console.log("Error fetching user data:", error.errorInfo);
    admin.app().delete();
    promise.reject('Error getting Firebase user ' + uid);
  });

  return promise.promise;
}