• Nodejs后端接口项目「可供练手」


    README相关

    建议

    • 下载nodemon以便接口改变之后热更新。
    npm i nodemon -g
    
    • 1

    使用

    • 下载相关依赖
    npm install
    
    • 1
    • 运行

    如果下载了nodemon

    nodemon app.js
    
    • 1

    如果没下载

    node app.js
    
    • 1

    测试方法

    • posterman

    一定记得,当你访问非api开头的接口时,发送请求一定要携带Authorization,否则你将没有权限处理。

    项目分析

    项目结构

    • app.js
    • config.js
    • package-lock.json
    • package.json
    • router_handler
      • user.js
      • userinfo.js
      • artcate.js
    • router
      • user.js
      • userinfo.js
      • artcate.js
    • schema
      • user.js
      • artcate.js
    • db
      • index.js

    项目重点

    1. 组件模块化

    app.js是入口文件,config.js是全局配置文件,router_handler是方法文件,router是导航文件,schema是用来存导入验证规则的包的相关配置文件。

    2. 前置配置

    • cors()跨域
    const cors = require('cors')
    app.use(cors())
    
    • 1
    • 2
    • 封装res.send()发送错误消息,在前面封装一个中间件,这样能够简化代码。
    app.use((req, res, next) => {
      // 默认 status 为 1 , 也就是有错误
      res.cc = function(err, status = 1) {
        res.send({
          status,
          message: err instanceof Error ? err.message : err
        })
      }
      next()
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 封装数据库
    const mysql = require('mysql')
    
    const db = mysql.createPool({
      host: '127.0.0.1',
      user: 'root',
      password: 'admin123',
      database: 'my_db_01'
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • bcryptjs用来给密码加密的
    // 导入 bcryptjs
    const bcrypt = require('bcryptjs')
    // 加密
    userInfo.password = bcrypt.hashSync(userInfo.password)
    // 判断密码是否合法
    const compareResult = bcrypt.compareSync(userInfo.password, result[0].password)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 生成token的包
    const jWT = reqire('jsonwebtoken')
    const tokenStr = jWT.sign(user, config.jwtSecretKey, {expiresIn: config.expires})
    // 前面一般要加上 Bearer
    res.send({
      status: 0,
      message: '登录成功',
      token: 'Bearer ' + tokenStr
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • @escook/express-joijoi

    用来做表单验证的

    /* scheme */
    // 导入定义规则的包
    const Joi = require('joi')
    const username = Joi.string().alphanum().min(1).max(10).required()
    const password = Joi.string()
                    .pattern(/^[\S]{6,12}$/)
                    .required()
    // define a rule
    exports.reg_login_schema = {
        // 都在body里存着
        body: {
            username: username,
            password: password,
        }
    }
    
    
    
    /* router */
    const express = require('express');
    const router = express.Router()
    const user_handler = require('../router_handler/user')
    
    // 1. 导入验证数据的中间件
    const expressJoi = require('@escook/express-joi')
    // 2. 导入需要的验证规则对象
    const { reg_login_schema } = require('../schema/user')
    // 可以复用这个校验规则
    router.post('/login', expressJoi(reg_login_schema), user_handler.login)
    
    module.exports = router
    + + + + + + + + // 是如下使用的 
    router.post('/login', expressJoi(reg_login_schema), user_handler.login)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    3. 数据库相关语法

    数据库的创建

    const mysql = require('mysql')
    
    const db = mysql.createPool({
      host: '127.0.0.1',
      user: 'root',
      password: 'admin123',
      database: 'my_db_01'
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    这里的用户是root,密码是admin123,数据库是my_db_01,端口用在了127.0.0.1

    SQL相关操作

    增删改查

    insert into users (username, password) values ('tony stark', '098123');
    
    • 1

    这个是正常的写法,只是当数据量极大的时候,括号里面的东西很难填完,所以我们需要有简化的写法。

    insert into 数据表 set ?
    -- Example
    const sqlStr2 = "insert into ev_users set ?"
    db.query(sqlStr2,{username: userInfo.username, password: userInfo.password}, () => {})
    
    • 1
    • 2
    • 3
    • 4

    问号表示这里放要插入的东西,set是简化写法

    delete from 数据表 where 标记地点
    delete from users where id=4 -- Example
    
    • 1
    • 2
    update 表名称 set 列名称 = 新值 where 列名称 = 某值
    
    • 1

    下面是简化写法&实际用法

    const sql = `update ev_users set ? where id=?`
    db.query(sql, [req.body, req.body.id], () => {})
    
    • 1
    • 2
    select * from users where id=2
    const sql = `select * from ev_article_cate where name=? or alias=?`
    
    • 1
    • 2

    *代表选择所有满足条件的

    一些其他

    • where用来限定我要增删改查啥。
    • andor用来在where中进行细节的处理和分析。
    • order by xxx用来排序

    其中有ascdesc分别表示正序排列和逆序排列。

    主要业务逻辑梳理

    可以看到,项目中主要分为了三个部分:

    1. user
    2. userinfo
    3. artcate

    其中,user是用来注册和登录的;userinfo是用来更改用户信息的,artcate是用来获取和更新文章及其分类的相关信息的。

    项目源码

  • 相关阅读:
    vulfocus——opensns命令执行(CNVD-2021-34590)
    华为全联接大会2023 | 尚宇亮:携手启动O3社区发布
    【无标题】SAR雷达系统反设计及典型目标建模与仿真实现研究——目标生成与检测(Matlab代码实现)
    单纯形法实现(GUI based on Matlab)全部的源代码
    pytorch神经网络工具箱
    网络知识:内网、外网、宽带、带宽、流量、网速之间的联系?
    【云原生】-Docker部署及使用压测神器sysbench
    babel6升级babel7,webpack3升级webpack4
    C高级第2天
    《操作系统-真象还原》09. 线程
  • 原文地址:https://blog.csdn.net/weixin_60789461/article/details/126347663