menu search

Firebase 上搭建评论系统 (想法)

Jul 11, 2017

用Firebase开发过一个校园内的项目,主要功能是提交问题和考试。使用Firebase真的是给我省了一大堆时间,毕竟我只需专注前端逻辑,后端不需要管。不过第一版我代码写的又臭又长🤦‍♀️,这个暑假准备重构。

最有意思的功能莫过于实时数据库了:提交的修改可以马上在所有的客户端上出现,完全不需要刷新页面。

熟悉了它的操作后,曾经有想过用Firebase Database搭建一个评论系统,来代替目前的这个,但最后这个想法还是被我否认了。最近又想起这事,写篇文章总结下遇到的问题。

优点

  • 无需维护服务器
  • 速度快
  • 免费套餐足够一个博客使用 (1G数据/10G下载)
  • 实时数据库。意味着新评论可以不刷新,就显示在所有访客的页面上。类似Disqus。
  • Google 信仰加成

当时写那个项目的时候,Firebase还没有推出Functions这个功能。这个新的功能真的很厉害,足以解决我目前遇到的所有问题,留到最后再讲好了。

数据库结构

- emails
	b5ce5a1bb15e33f4a7af1d44f2f89767: "[email protected]"
- posts
	test (文章ID)
		comments
			-KhBgtK6VUZX9fup-fGd (评论ID,自动生成)
				date: 1491640487594
				email: "b5ce5a1bb15e33f4a7af1d44f2f89767"
				message: "Test"
				name: "Jimmy"
			-KhBgtu1PE2OtwQnZoVA
				date: 1491640489978
				email: "b5ce5a1bb15e33f4a7af1d44f2f89767"
				message: "Test"
				name: "Jimmy"
				parent: "-KhBgtK6VUZX9fup-fGd"

Firebase Database采用JSON来储存数据,所以会有不同的层次。目前的想法是在子评论上加入一个指向父评论的ID,而不是使用嵌套。主要是为了以后可以方便的取出整个页面的总评论数。

邮箱的MD5会在客户端生成,然后与其余的评论数据写入数据库。但与此同时,原邮箱地址会存入emails树下,用于评论邮件提醒功能

Firebase可以设置一个树只能被写,而不可读,所以这么做应该是没有什么问题的。

之前的想法是在每次提交评论后发送一个带有评论ID的请求到自己的服务器上,并从那里处理这个过程。为了避免多次请求,可以检查时间戳,确保与当前的时间差距。

遇到的一个问题是,在这个结构下,似乎无法取出最新的评论:需要评论都处于同一个目录才能对比。

遇到的问题

  • 官方的脚本太大了:~351KB,毕竟包含了Firebase的所有功能
  • 需要设置好权限,以防评论被恶意篡改
  • 评论邮件需要另一个服务器
  • 无法获取最新的评论

With Cloud Functions

这个功能真的是特别Excited,可以解决一堆问题。

基本上等于是一个Node.js + Express服务器,可以在上面写好逻辑,并返回你需要的数据。当然,它还能做更多事情,例如监听数据库变化,并发送邮件

有了它之后,评论系统可以改成这样子:

  1. 前端发送请求到Functions服务器
  2. 服务器处理评论,并把邮箱地址编码为MD5
  3. 返回JSON格式的评论数据

提交评论的方式变为:

  1. 前端发送请求到服务器
  2. 服务器返回评论,并把邮箱地址编码为MD5
  3. 后台异步处理评论邮件提醒

这么一来,处理MD5的这个任务就从前端转移到了后端,就可以少加载一个脚本。同时,也不必再加载官方的脚本

这个方案的缺点是会丧失实时数据库的功能:客户端不会与服务器保持一个WebSocket。

但最大的好处在于客户端不能直接修改数据库,需要通过后端做中转。后端可以做验证,例如防重复提交,或防机器人的验证。

另外,后端也可以处理数据,并返回指定文章的评论数量。

获取最新评论,我有几个想法:

  • 后端可以遍历所有评论,并合并成一个数组,然后进行对比。
    这个方案的最大问题在于处理时间会按照评论数变长。
  • 监听评论提交,并把最新评论保存在一个目录
  • 更改数据库结构

最后

目前我还没想好是否有必要转移过去,毕竟进去后,我很难保证以后可以再转移到其他平台。同时,Firebase以后会不会被墙也是个问题

Firebase Storage 本是一个可以用来做评论图片上传的功能,然而由于它用的域名是firebasestorage.googleapis.com,还是难逃被墙的命运。

数据库的链接用的是firebaseio.com,目前还没遭黑手,但不能保证未来依然安全。

真是有够恶心的东西,都2017年了居然还活着。希望在不久的未来,这堵墙可以消失。

Comments

edit x send markdown image
paragraph comment heart