使用Node.js搭建的微服务器基本流程

发布时间 2023-06-05 21:27:56作者: 學吳紫荆

前言

使用Node.js搭建的微服务器, 处理注册登录操作的流程详解。主要包括注册,登录两大模块。

Node.js项目的搭建

基于Express框架mongodb数据库搭建的Web服务器基本配置

1. 初始化Node.js项目

`npm init`

2. 项目目录结构

图片.png

3. 项目结构介绍

  • config: 保存项目一些公共的配置
  • db: 数据库相关操作文件夹。back文件夹保存连接成功及失败的回调。config文件夹保存连接数据库时的配置信息。models文件夹保存模型对象。index.js文件数据库相关操作入口文件。
  • router: 保存路由的文件
  • router_handler: 保存路由处理函数
  • schema: 一般保存用户登录数据的验证规则
  • app.js: 项目入口文件

4. 安装项目依赖(一般所需的依赖) npm i

  • express
  • cors
  • express-jwt
  • @escook/express-joi
  • joi
  • jsonwebtoken
  • md5
  • mongoose

项目基本代码结构

1. app.js代码结构

点击查看代码
    // 导入 express 模块
    const express = require('express')
    // 导入 cors 中间件
    const cors = require('cors')
    // 导入路由
    const userRouter = require('./router/user')

    // 创建应用实例
    const app = express()

    // 注册全局中间件解析token: 在路由注册之前
    // 可以很容易地保护资源和 API 接口,有效防止未经授权的访问
    // 注意: 注册操作时不需要进行保护该路由
    app.use((err, req, res, next) => {
      console.log('发生了错误: ' + err.message) // 服务端提示
      res.send('发生了错误: ' + err.message) // 客户端提示
    })

    // 注册全局中间件, 允许跨域请求
    app.use(cors())

    // 注册路由
    app.use('/api', userRouter)

    // 配置内置中间件, 解析 HTTP 请求体中的 URL 编码数据
    app.use(express.urlencoded({ extended: false }))

    // 配置错误级别中间件: 必须注册在所有路由之后
    app.use((err, req, res, next) => {
      console.log('发生了错误: ' + err.message) // 服务端提示
      res.send('发生了错误: ' + err.message) // 客户端提示
    })

    // 监听端口
    app.listen(9000, () => {
      console.log('服务启动成功')
    })

2. config-config.js代码结构

点击查看代码
 // 向外共享 加密 和 还原 Token 的 jwtSecretKey 字符串
    module.exports = { jwtSecretKey: 'CodeGoat24 ^_^_coderPanz', }

4. router-user.js代码结构

点击查看代码
// 导入express
    const express = require('express')
    // 通过express创建路由
    const router = express.Router()  
    // 导入路由处理函数
    const userHandler = require('../schema/user')
    // 导入验证规则对象
    const { formCheckObj } = require('../schema/user')
    // 导入表单验证中间件
    const expressJoi = require('@escook/epress-joi')
    const validataUser = expressJoi(formCheckObj)

    // router.post()路由: 登录操作
    // 1. 在用户登录的路由中,声明局部中间件,对当前请求中携带的数据进行验证
    // 2. 数据验证通过后,会把这次请求流转给后面的路由处理函数
    // 3. 数据验证失败后,终止后续代码的执行,并抛出一个全局的 Error 错误
    router.post('/login', validataUser, userHandler.login)

    // 导出路由, 供app.js进行注册使用
      module.exports = router

4. router_handler-user.js代码结构

点击查看代码
// <在这里定义和用户相关的路由处理函数,供 /router/user.js 模块进行调用>

    // 导入md5: 对密码进行单向加密操作后再保存到数据库
    const md5 = require('md5')
    // 导入jwt生成token字符串
    const jwt = require('jsonwebtoken')
    // 导入jwtSecretKey 字符串
    const config = require('../config/config')
    // 登录请求的处理函数
    exports.login = (req, res) => {
    // 生成token字符串并返回给客户端
    }

5. schema-user.js代码结构

点击查看代码
 // 表单验证--前端为辅, 后端为主

    // 1.导入joi为表单中携带的每个数据项,定义验证规则
    const joi = require("joi");
    // 2. 安装 @escook/express-joi 中间件,来实现自动对表单数据进行验证的功能

    // set用户名的验证规则
    const username = joi
      .string()
      .alphanum()
      .min(3)
      .max(8)
      .required();

    // set密码验证规则
    const password = joi
      .string()
      .pattern(/^(?=.*[a-zA-Z])(?=.*\d).{3,8}$/)
      .min(3)
      .max(8)
      .required();

    // 向外共享表单验证规则对象
    exports.formCheckObj = {
      // 校验req.body中的数据
      body: {
        username,
        password,
      },
      // 校验req.query中的数据
      // 校验req.params中的数据
    };

数据库相关代码结构

把数据库的相关操作都封装在了db文件夹下

1. config-config.js代码结构

点击查看代码
// 连接mogodb数据库的配置信息
    module.exports = {
      HOST: '127.0.0.1',
      PORT: 27017,
      NAME: 'bms'
    }

2. back-db.js代码结构

点击查看代码
// 导入配置信息
    const { HOST, PORT, NAME } = require('../config/config')
    /**
     *
     * @param {*} success // 连接成功的回调
     * @param {*} error // 连接失败的回调
     */

    module.exports = (success, error) => {
      // 优化操作, 外部不需要传入error函数, 实现在内部回调即可
      if(typeof error !== 'function') {
        error = () => {
          console.log('连接失败')
        }
      }
      const mongoose = require('mongoose')
      mongoose.connect(`mongodb://${HOST}:${PORT}/${NAME}`)
      mongoose.connection.once('open', () => {
        success()
      })
      mongoose.connection.once('error', () => {
        error()
      })
      mongoose.connection.once('close', () => {
        console.log('连接关闭')
      })
    }

3. models-loginModel.js代码结构

点击查看代码
// 创建模型对象的文件

    // 导入mongoose
    const mongoose = require('mongoose')
    // 创建文档的结构对象
    let loginSchema = new mongoose.Schema({
      username: String,
      password: String,
      token: String
    })
    // 创建模型对象, 可以通过模型对象进行文档的增删改查
    let loginModel = mongoose.model('login', loginSchema)

    // 导出对象
    module.exports = loginModel

4. index.js代码结构

点击查看代码
 // 数据库操作入口文件

   // 导入连接后的回调文件
    const db = require('./back/db')

    // 导入模型对象
    const loginModel = require('./models/loginModel')
    db(() => {
      console.log('连接成功')
      // 连接成功后进行数据库的一些增删改查操作
    })

至此, Node.js搭建的Web服务器就基本完成, 后去可以在这个模板的基础上写相关的接口和数据库的增删改查操作。