使用 Express.js 和 Firebase 创建现代 Web 应用程序的完整指南

随着互联网的飞速发展,越来越多的企业和个人开始关注将他们的业务从纯粹的线下转移到线上。现代 Web 应用程序不仅需要有良好的用户体验,还要具备高可扩展性、安全性、实时性等特性。在这篇文章中,我们将介绍如何使用 Express.js 和 Firebase 来构建具有这些特性的现代 Web 应用程序,并深入学习其中的知识和技巧。

什么是 Express.js?

Express.js 是一个 Node.js 的 Web 应用程序框架,它提供了一系列丰富的功能和插件,使得开发者可以更加高效地构建 Web 应用程序。Express.js 同时提供了 HTTP 服务和中间件支持,让你可以轻松地进行路由控制、模板渲染、数据输入验证等操作。

什么是 Firebase?

Firebase 是一个 Google 开发的移动和 Web 应用程序开发平台,它支持实时数据库、身份认证、文件存储、云函数等功能。使用 Firebase,你可以在不编写任何后端代码的情况下,快速搭建出全功能的服务器端应用程序。

准备工作

在我们开始使用 Express.js 和 Firebase 来构建现代 Web 应用程序之前,我们需要先进行一些准备工作。首先,我们需要在本地安装一些必要的软件:

  • Node.js:用于运行 JavaScript 程序的服务器端平台。
  • Express.js:一个流行的 Node.js Web 应用程序框架,提供了一系列丰富的功能和插件。
  • Firebase CLI:Firebase 命令行工具,用于在本地开发和部署 Firebase 应用程序。

安装完以上软件后,我们就可以开始构建我们的应用程序了。

步骤一:创建一个 Express.js 应用程序

首先,我们需要创建一个 Express.js 应用程序。打开你的终端,并使用以下命令来创建一个新的应用程序:

以上命令将会在当前目录下创建一个名为 myapp 的文件夹,并在其中初始化一个新的 Node.js 应用程序。我们还安装了 Express.js 并将其保存到了 package.json 文件中。

现在,我们需要在 myapp 文件夹中创建一个名为 index.js 的文件,并将以下代码添加到其中:

const express = require('express')
const app = express()

app.get('/', (req, res) => {
  res.send('Hello World!')
})

app.listen(3000, () => {
  console.log('Example app listening on port 3000!')
})

以上代码创建了一个简单的 Express.js 应用程序,它监听 3000 端口,并在访问根路由时返回 "Hello World!" 字符串。

使用以下命令来启动这个应用程序:

现在我们可以在浏览器中访问 http://localhost:3000 并看到 "Hello World!" 的输出。

步骤二:集成 Firebase 实时数据库

接下来,我们需要将 Firebase 实时数据库集成到我们的应用程序中。首先,我们需要在 Firebase 控制台中创建一个新的项目,并在这个项目中启用实时数据库功能。然后,我们需要获取到这个项目的凭证信息,并在本地配置 Firebase CLI 及它的初始化项目。

请参考官方文档来进行 Firebase 实时数据库的初始化和配置。

在我们成功初始化了 Firebase CLI 并且配置好了项目之后,我们可以在应用程序中使用 Firebase 实时数据库方法来读取和写入数据。下面是一个简单的示例:

const admin = require('firebase-admin')
const express = require('express')

const serviceAccount = require('./path/to/serviceAccountKey.json');

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: 'https://<DATABASE_NAME>.firebaseio.com'
})

const app = express()

app.get('/', (req, res) => {
  const ref = admin.database().ref('/')
  ref.once('value').then(snapshot => {
    res.send(snapshot.val())
  })
})

app.listen(3000, () => {
  console.log('Example app listening on port 3000!')
})

在以上示例中,我们使用了 Firebase 实时数据库的 JavaScript 客户端库来读取根节点数据,并在返回值时将其作为响应的 body 输出到客户端。这不过是一个简单的示例,实际上我们可以在应用程序中使用 Firebase 实时数据库极其强大的查询和监听等功能来进行数据操作。

步骤三:身份认证和授权

现代 Web 应用程序的另一个重要特性就是身份认证和授权。对于许多应用程序而言,用户身份认证和授权是非常重要的,它们可以防止不受控制的数据访问和滥用。Firebase 提供了一些非常强大的身份验证和授权功能,可以轻松地在我们的应用程序中使用。

首先,我们需要在 Firebase 控制台中启用身份认证功能,并选择合适的身份认证提供者。Firebase 支持谷歌、Facebook、Twitter、密码和匿名等多种身份认证提供者。我们可以根据应用程序的需要选择合适的身份认证提供者。

然后,我们可以在应用程序中使用 Firebase SDK 来完成身份认证和授权相关的操作。下面是一个简单的示例:

const admin = require('firebase-admin')
const express = require('express')
const bodyParser = require('body-parser')
const cookieParser = require('cookie-parser')

const serviceAccount = require('./path/to/serviceAccountKey.json');

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: 'https://<DATABASE_NAME>.firebaseio.com'
})

const app = express()

app.use(bodyParser.urlencoded({ extended: true }))
app.use(bodyParser.json())
app.use(cookieParser())

app.post('/login', (req, res) => {
  const { email, password } = req.body

  admin.auth().signInWithEmailAndPassword(email, password)
    .then(user => {
      res.cookie('user', JSON.stringify(user))
      res.send({ status: 'ok' })
    })
    .catch(error => {
      res.send({ status: 'fail', message: error.message })
    })
})

app.get('/logout', (req, res) => {
  res.clearCookie('user')
  res.redirect('/')
})

app.get('/', (req, res) => {
  const { user } = req.cookies
  if (user) {
    // 认证成功,返回用户相关信息
    res.send(JSON.parse(user))
  } else {
    // 认证失败,跳转到登录页面
    res.redirect('/login')
  }
})

app.listen(3000, () => {
  console.log('Example app listening on port 3000!')
})

在以上示例中,我们使用了 Firebase 实时数据库的 JavaScript 客户端库来创建了一个登录接口。在用户输入正确的用户名和密码后,我们将通过 Firebase Authentication API 来验证这些凭证的正确性。如果验证通过,我们会将用户信息保存在 cookie 中,以便后续的操作可以使用。

步骤四:实时功能和消息传递

现代 Web 应用程序通常需要支持实时功能和消息传递。这些功能可以让用户在不刷新网页的情况下获得实时的更新和消息,显著提高了应用程序的交互性和用户体验。Firebase 为实时功能和消息传递提供了非常好的支持和功能,使得开发者可以很容易地在应用程序中实现相应的功能。

在使用 Firebase 实时数据库时,我们可以使用 Firebase Realtime Database 的数据监听和更新功能来实现实时功能。下面是一个简单的示例:

const admin = require('firebase-admin')
const express = require('express')
const firebase = require('firebase')

const firebaseConfig = require('./path/to/firebaseConfig.json')

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: 'https://<DATABASE_NAME>.firebaseio.com'
})

firebase.initializeApp(firebaseConfig)

const app = express()

app.get('/', (req, res) => {
  const ref = admin.database().ref('/')
  ref.on('value', snapshot => {
    res.send(snapshot.val())
  })
})

app.post('/', (req, res) => {
  const { data } = req.body
  const ref = firebase.database().ref('/')
  ref.push(data)
  res.send({ status: 'ok' })
})

app.listen(3000, () => {
  console.log('Example app listening on port 3000!')
})

在以上示例中,我们使用了 Firebase 实时数据库的数据监听和更新功能。当有数据更新时,监听程序会立即被触发,我们可以使用响应结果来返回实时的数据信息。

结论

在本文中,我们介绍了如何使用 Express.js 和 Firebase 来构建现代 Web 应用程序。我们深入学习了身份认证和授权、实时功能和消息传递相关的技术和知识,并使用了示例代码来演示如何使用这些功能。这些知识和技术可以为我们创建更具有交互性和可扩展性的应用程序提供很好的支持和帮助,它们可以让我们更加高效地构建现代 Web 应用程序。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/66f7ddbdc5c563ced5afa976