首页 > 编程语言 >使用Node.js搭建的微服务器基本流程

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

时间:2023-06-05 21:34:57浏览次数:51  
标签:Node const require express js 导入 服务器 代码

前言

使用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服务器就基本完成, 后去可以在这个模板的基础上写相关的接口和数据库的增删改查操作。

标签:Node,const,require,express,js,导入,服务器,代码
From: https://www.cnblogs.com/coderPanz/p/17458953.html

相关文章

  • 搭建本地开发服务器
    原文点此跳转注意在上一个案例的基础上添加本地开发服务器,请保留上个案例的代码。如需要请查看 Webpack使用。搭建本地开发服务器这一个环节是非常有必要的,我们不可能每次修改源代码就重新打包一次。这样的操作是不是太繁琐了。所以本地开发服务器的作用就能体现了,它会自动监听我......
  • Vue基础之表单控制 ,v-model进阶,箭头函数,JS循环
    目录一、表单控制1.checkbox选中2.radio单选3、checkbox多选4.购物车案例-结算二、v-model进阶三、箭头函数es6的语法1无参数,无返回值2有一个参数,没有返回值,可以省略括号3多个参数,不能省略括号4多个参数,不能省略括号,一个返回值5一个参数,一个返回值四、补充:JS循环一、表......
  • 在win2016服务器上安装Loadrunner 11版本
    背景:在自己的本机上安装LR12,去录制和调试脚本。在win2016(win2013、win2008都可以)上安装LR11并且破解。则可以做到使用Loadrunner工具进行压测。 在2年的压测过程中,装了2次LR11,记录一下过程,容易踩坑的是安装.net的补丁包!详细步骤:安装LR11  遇到问题(一般新申请的机器......
  • CATIA-CATIA V5-6R2017 WIN10 64位版本安装+许可证的安装配置(CATIA启动时必须要调用许
    CATIAV5-6R2017WIN1064位安装步骤:1.先使用“百度网盘客户端”下载CATIAV5-6R2017软件安装包到电脑磁盘英文路径文件夹下,并解压缩,安装前先断开电脑网络,然后双击打开CATIAV5R2017文件夹,找到setup.exe,鼠标右击选择【以管理员身份运行】2.正在准备安装中,稍等片刻自动进入安......
  • C# FileUpload 实现上传限定类型和大小的文件到服务器
    上传文件有两个主要的目的地,一个是服务器,另一个是数据库,ASP.NET内置了FileUpload这个上传控件,文本框显示用户选择的文件的全名.其属性主要包括:ContenLength:上传文件大小,单位:字节FileName:文件名称HasFile:是否选择了文件例子:测试环境.net2.0(内有详细说明)default......
  • selenium click skip_button("introjs-skipbutton")
    classINTERFACING():def__init__(self):self.driver_initialized=Falseself.driver=''self.MAX_TRIALS=2#self.chrome_version=get_google_chrome_version()defmake_soup(self):returnBeaut......
  • 【JavaScript】想在JS中使用换行符,我该怎么操作呢?
    使用'\n'换行,而不是'\n'注意前后空格实战demo:$('#text').val('hello'+'\n'+'world');......
  • 浏览器请求转换成Postman和postman请求转Java/JS.等后端代码
     unirest为例:<!--与postman非常友好的RPC框架--><dependency><groupId>com.konghq</groupId><artifactId>unirest-java</artifactId><version>3.5.00</version></depend......
  • 精易模块类_json的使用方法
    一般解析{ "code":0, "whwswswws":"ej7ltErOLmBq00vH-Cg2EFw", "openall":1, "openalltouch":1, "processtype":1, "appidStatuscode":0}.版本2.支持库specJSON.解析(#INFO,,)调试输出(JSON.取属性对象......
  • git add 时报错 warning: in the working copy of 'package-lock.json', LF will...
    来源:https://blog.csdn.net/qq_43842093/article/details/128471953问题:执行gitadd.时报错: 原因:换行符的问题, Windows下换行符和Unix下的换行符不一样,git会自动转换。 解决办法: 执行如下命令:gitconfig--globalcore.autocrlffalse问题解决 ......