如何将userId变量传入Cloud Firestore的doc()方法获取对应文档
问题原因&解决方法
你最开始写的db.collection('device').doc(userId)本身语法是合法的,运行失败大概率是变量值类型不匹配或者取值异常,你尝试的两种写法都属于语法使用错误:
.doc('userId')是直接传入了固定字符串userId,会查询ID就是userId这个字符串的文档,和你定义的变量毫无关联.doc('${userId}')属于模板字符串语法使用错误,JavaScript的模板字符串必须用**反引号(`)**包裹才会解析内部的变量,单引号包裹时只会被当成普通字符串处理
正确实现方案
首先先加一行打印确认你拿到的userId符合预期:
const userId = snap.data().userId; // 打印确认值和类型,排查是否是undefined、数字类型和文档ID不匹配的问题 console.log('userId取值:', userId, '类型:', typeof userId);
接下来三种写法都可以实现需求,按需选择即可:
- 直接传入变量(最简洁,推荐)
const deviceDoc = db.collection('device').doc(userId);
- 用模板字符串传入(需要用反引号包裹)
const deviceDoc = db.collection('device').doc(`${userId}`);
- 强制转成字符串传入(适合确认文档ID是字符串类型,但拿到的userId是数字的场景)
const deviceDoc = db.collection('device').doc(String(userId));
补充优化建议
你当前的代码缺少文档存在性判断,当对应用户的device文档不存在时直接调用.data()会抛出异常,建议补全判断逻辑:
const deviceDoc = db.collection('device').doc(userId); const deviceData = await deviceDoc.get(); // 补全存在性判断 if (!deviceData.exists) { console.log(`未找到ID为${userId}的device文档`); return; // 或者走你的异常处理逻辑 } const deviceToken = deviceData.data().token;
内容的提问来源于stack exchange,提问作者LostTexan
相关产品推荐
相关产品推荐

