我正在尝试使用函数为我的Firebase项目创建API。困难的部分是,我正在使用TypeScript,我不断遇到打字问题。
这是我的注册路线:
app.post('/signup', (req: Request, res: Response) =>{
const newUser = {
email: req.body.email,
password: req.body.password,
confirmPassword: req.body.confirmPassword,
handle: req.body.handle
}
// TODO: validate data
db.doc(`/users/${newUser.handle}`).get()
.then( doc => {
// Duplicated handle
if(doc.exists){
return res.status(400).json({ handle: 'this handle is already taken'});
}
// Valid handle
else {
return firebase.auth().createUserWithEmailAndPassword(newUser.email, newUser.password);
}
})
.then( data => {
return data.user.getIdToken();
})
.then( token => {
return res.status(201).json({ token });
})
.catch( err => {
console.error(err);
return res.status(500).json({ error: err.code })
});
})
错误:
1.第一个中的文档有以下错误
类型为“”的参数(doc:DocumentSnapshot)=>响应|Promise“”不可分配给类型“”的参数(值:DocumentSnapshot)=> UserCredential| PromiseLike '。
这是因为如果句柄已经存在,我将返回一个响应状态,以避免重复。据我所知,这将去捕捉;有效句柄将返回下一个then将采用的Promise。然而,这是行不通的
- data.user.getIdToken()表示
类型“DocumentSnapshot”上不存在属性“user”。尝试在使用前删除用户的常量,但得到相同的消息。
我有其他功能的职位,并从消防工作,但不能得到认证的工作。
谢谢你的帮助!
1条答案
按热度按时间hgtggwj01#
我没有测试过你的代码,但你的两个问题很可能都来自于你调用了
firebase.auth().createUserWithEmailAndPassword()
和getIdToken()
,它们是JavaScript SDK的方法。在Cloud函数中,需要使用Admin SDK,因此调用
createuser()
方法。请注意,为了使用Admin SDK,我们将
firebase
替换为admin
。不要忘记使用const admin = require('firebase-admin'); admin.initializeApp();
初始化它。参见https://firebase.google.com/docs/functions/get-started?authuser=0#import-the-required-modules-and-initialize-an-app。然后,您将使用
getIdToken()
,这也是JavaScript SDK中的一个方法。您需要根据您的确切目标来调整代码,方法是将令牌发送回前端。
如果您想在前端登录用户,只需返回用户已成功创建的信息,然后在前端调用
signInWithEmailAndPassword()
方法。最后,请注意另外两个要点:
1.您应该使用Transaction检查用户文档是否不存在
db
变量应声明为admin.firestore()
。