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;
}
我在无服务器项目的 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;
}