标签引入 SDK,然后初始化应用:import { initializeApp } from "firebase/app";
import { getDatabase, ref, set } from "firebase/database";
const app = initializeApp({
apiKey: "你的 API 密钥",
authDomain: "项目域名",
databaseURL: "数据库 URL",
projectId: "项目 ID"
});
const db = getDatabase(app);
createUserWithEmailAndPassword
方法,记得同时在数据库创建用户初始数据:import { createUserWithEmailAndPassword, getAuth } from "firebase/auth";
const auth = getAuth();
createUserWithEmailAndPassword(auth, "user@example.com", "password")
.then((userCredential) => {
const user = userCredential.user;
set(ref(db, `users/${user.uid}`), {
email: user.email,
createdAt: Date.now(),
roles: ["user"] // 预设用户角色
});
});
signInWithEmailAndPassword
,这里有个关键细节:记得开启「密码重置」功能,用户体验好不好就看这一步。控制台里「身份验证」→「设置」里就能启用,顺便把邮箱模板改成符合产品调性的文案。import { GoogleAuthProvider, signInWithPopup } from "firebase/auth";
const provider = new GoogleAuthProvider();
signInWithPopup(auth, provider)
.then((result) => {
const user = result.user;
// 检查用户是否已存在,不存在则创建数据库记录
const userRef = ref(db, `users/${user.uid}`);
get(userRef).then((snapshot) => {
if (!snapshot.exists()) {
set(userRef, {
displayName: user.displayName,
photoURL: user.photoURL,
providerId: user.providerId,
createdAt: Date.now()
});
}
});
});
messages
├── room_1
│ ├── 1623456789012: { userId: "u1", text: "Hello" }
│ ├── 1623456790045: { userId: "u2", text: "Hi" }
└── room_2
├── 1623456800123: { userId: "u3", text: "What's up?" }
{
"rules": {
"users": {
"$uid": {
".read": "$uid === auth.uid",
".write": "$uid === auth.uid"
}
},
"publicData": {
".read": true,
".write": "auth != null" // 登录用户可写
}
}
}
match
语句结合通配符实现复杂权限,比如限制用户只能修改自己 1 小时内发布的内容:"posts": {
"$postId": {
".read": true,
".write": "auth != null && data.authorId === auth.uid && now - data.timestamp < 3600000"
}
}
auth.onAuthStateChanged
监听用户状态,获取 uid
后加载对应数据:auth.onAuthStateChanged((user) => {
if (user) {
const userRef = ref(db, `users/${user.uid}`);
onValue(userRef, (snapshot) => {
renderUserProfile(snapshot.val());
});
}
});
set(ref(db, `users/${user.uid}/nickname`), "新昵称");
users
节点,结合安全规则限制只能管理员角色访问(需要在用户数据里添加 roles
字段,如 ["admin"]
)。onChildAdded
监听消息节点,新消息到达时自动更新列表:const roomRef = ref(db, `messages/room_1`);
onChildAdded(roomRef, (snapshot) => {
addMessageToUI(snapshot.val());
});
set
方法的回调函数判断是否成功。/.info/connected
节点检测网络连接,在 users/${uid}/online
节点写入 true/false
,结合 onDisconnect()
方法自动更新离线状态:const onlineRef = ref(db, `users/${user.uid}/online`);
onlineRef.onDisconnect().set(false);
onlineRef.set(true);
docs/${docId}/versions
节点,使用 push()
生成唯一键,确保并发写入不冲突。const admin = require("firebase-admin");
admin.initializeApp();
const dbAdmin = admin.database();
dbAdmin.ref(`users/${uid}/plan`).set("premium");
transaction
方法避免竞态条件:const counterRef = ref(db, `counters/${key}`);
update(counterRef, (currentValue) => (currentValue || ) + );
set
的回调函数处理失败情况。同时,善用 onValue
监听实时更新,避免手动轮询。exports.deleteUser = functions.auth.user().onDelete((user) => {
return db.ref(`users/${user.uid}`).remove();
});
tags
数组,查询时通过 orderByChild
和 equalTo
组合:const query = query(ref(db, "posts"), orderByChild("tags"), equalTo("技术"));
auth.user()
事件:exports.sendWelcomeEmail = functions.auth.user().onCreate((user) => {
// 调用邮件发送服务
return sendEmail(user.email, "欢迎注册", "感谢你的加入!");
});
🔍 界面设计与操作便捷性:谁更懂用户需求? 先来说说 51 论文查重和 PaperYY 的界面设计。51 论文查重的界面走的是简洁风,一打开就能看到上传文件的入口,没有多余的广告干扰,对新手很友好。
🚀AI 重塑公众号分发:2025 年千人千面的技术密码 🧠 深度语义理解:从关键词匹配到情感捕捉 AI 推荐算法的核心突破在于深度语义理解能力的进化。以微信公众号为例,2025 年的算法已能解析文
📌 AI 伪原创的核心价值:不是抄袭,是效率革命很多人一提伪原创就觉得是投机取巧,其实高质量的 AI 伪原创本质是内容生产效率的升级。传统原创一篇 1000 字的行业文章,从选题到成稿至少要 3
📝2025 最新查重系统使用教程,手把手教你完成本科论文检测 现在各平台对于原创作品要求极高,简单的 AI 写作已经不能够通过原创检测,因此写作方法要全面升级,既要兼顾文章的吸引力、有流量属性,又要
现在做自媒体的,谁没为标题犯过愁?花两小时写篇稿子,标题想半天,最后发出去点击率惨淡,那种感觉真的挺挫败的。最近被朋友安利了第五 AI 的流量标题生成器,网址是diwuai.com,说是能让文章点击率
?️ 选择合适的 AI 工具:从简历到求职信的第一步 市面上的 AI 求职信生成工具有很多,不同工具的侧重点和操作方式不太一样。咱先说说怎么挑到顺手的。像 Grammarly 的 AI 写作助手,不仅
? SendGrid 2025 最新邮件发送与营销自动化平台功能解析 随着企业对精准营销和高效沟通的需求激增,邮件营销平台的功能迭代成为行业焦点。SendGrid 作为全球领先的邮件服务提供商,在 2
? 2025 最新!Glaze 插画素材下载及版权保护全解析 在如今的数字时代,插画素材的获取和版权保护是设计师和创作者们关注的焦点。Glaze 作为一个专注于插画素材的平台,在 2025 年带来了全