使用Typescript嵌套promise的Firebase函数

k5ifujac  于 2023-06-07  发布在  TypeScript
关注(0)|答案(1)|浏览(177)

我正在尝试使用函数为我的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。然而,这是行不通的

  1. data.user.getIdToken()表示
    类型“DocumentSnapshot”上不存在属性“user”。尝试在使用前删除用户的常量,但得到相同的消息。
    我有其他功能的职位,并从消防工作,但不能得到认证的工作。
    谢谢你的帮助!
hgtggwj0

hgtggwj01#

我没有测试过你的代码,但你的两个问题很可能都来自于你调用了firebase.auth().createUserWithEmailAndPassword()getIdToken(),它们是JavaScript SDK的方法。
在Cloud函数中,需要使用Admin SDK,因此调用createuser()方法。

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 admin.auth().createUser(newUser.email, newUser.password); 
      }
    })
    .then(userRecord => {
      //... see below 
    })

请注意,为了使用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检查用户文档是否不存在

  1. db变量应声明为admin.firestore()

相关问题