代码之家  ›  专栏  ›  技术社区  ›  J. Doe

通过字符串初始化documentReference失败

  •  0
  • J. Doe  · 技术社区  · 8 年前

    我有一个方法,它返回一个字符串,我确信该字符串指向文档。按以下方式使用该字符串时:

    const docRef = "users/uid/data/online"
    const dbPath = db.doc(docRef)
    console.log(dbPath.path)
    return dbPath.set({"test" : 1})
    

    它失败:

    enter image description here

    如果我使用db。集合(“用户”)。文档(uid)。。。。。。它起作用了。如何通过typescript中的字符串创建文档引用?

    应根据以下文件进行操作: https://firebase.google.com/docs/firestore/data-model#references

    编辑:这是我的班级:

    export enum UserCollection {
        online = "online",
        private = "private",
        server = "server"
    }
    
    export enum UserDocument { 
        online = "online",
        private = "private",
        server = "server"
    }
    
    class ManagerPath { 
    
        pathToUser = "users/"
    
        getPathToUser(uid: string, userCollection: UserCollection, userDocument: UserDocument): string { 
            return this.pathToUser + "/" + uid + "/" + userCollection + "/" + userDocument;
        }
    
    }
    
    export const managerPath = new ManagerPath();
    

    这就是我检索路径的方式:

    exports.initializeNewUser = functions.auth.user().onCreate((user) => {
        const test = managerPath.getPathToUser(user.uid, UserCollection.online, UserDocument.online);
        console.log(test)
        const dbPath = db.doc(test)
        return dbPath.set({"dateCreation" : Date.now()}) //fails
    })
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Jason Berryman    8 年前

    您可能还希望在 /users 集合,以及 online 子集合。否则,您将最终得到一个孤立的集合。我已经添加了一些代码来作为一个批处理来完成这项工作。

    您还可以从 user 事件,您可以将其保存在文档中,例如电子邮件、姓名、照片URL等。

    我不确定这是否是你想要的,但它应该满足你的需要。

    exports.initializeNewUser = functions.auth.user().onCreate((user) => {
        const userRef = db.doc(`users/${user.uid}`);
        const userOnlineRef = db.doc(`users/${user.uid}/online/online`);
        const dateCreation = user.metadata.creationTime;
    
        let batch = db.batch();
        batch.create(userRef, {dateCreation})
        batch.create(userOnlineRef, {dateCreation})
        return batch.commit();
    })
    

    需要(>)=功能SDK的1.0.0

    正在修复代码

    您已声明 pathToUser 像 "users/" 然后添加了另一个 / 。您可以通过修改以下行来解决此问题

    return this.pathToUser + "/" + uid + "/" + userCollection + "/" + userDocument;
    

    到

    return this.pathToUser + uid + "/" + userCollection + "/" + userDocument;
    

    或

    pathToUser = 'users'; // The trailing / has been removed
    
    return `${this.pathToUser}/${uid}/${userCollection}/${userDocument}`;