文章目录

  • node:ORM、数据模型、脚本创建模型与服务层
  • 控制层
  • 服务层
  • MYSQL
  • SQL
  • ORM--sequelize
  • 脚本
  • 增加服务层(查询数据库放在服务层)

node:ORM、数据模型、脚本创建模型与服务层


插一句:若要删除node_modules下的所有依赖,或者为了要跟换版本而删除所有依赖,命令如下:

rm -rf node_modules\
cnpm i
//package.json
{"name": "0","version": "1.0.0","description": "","main": "express-run.js","scripts": {"start": "babel-node main.js","dev": "cross-env PORT=4000 babel-node main.js"},"keywords": [],"author": "","license": "ISC","dependencies": {"babel-cli": "^6.26.0","babel-node": "^0.0.1-security","babel-plugin-add-module-exports": "^1.0.2","babel-preset-env": "^1.7.0","body-parser": "^1.19.0","cross-env": "^7.0.2","express": "^4.17.1","mysql2": "^2.1.0","sequelize": "^5.21.2","winston": "^3.3.2"}
}

控制层

  • 作用:参数验证,控制接口的调用逻辑
  • 流程逻辑比喻:(验证参数–查询数据库–写入redis–生成jwt–返回json)
  • 若把上面每一步代码代码都写在控制器,代码冗余

服务层

  • 数据库的操作抽到服务层
  • 生成jwt抽到一个工具箱,其它模块需要直接导入
  • 需要导入数据模型,用于操作数据库

MYSQL

  • 版本5.7.xx, 安装mysql数据库
  • 导入sql脚本 表名 列名(字段名) 字段类型 数据长度 主键(唯一)
  • Navicat Premium 使用工具导入sql,先连接到mysql,创建表初始化数据库

SQL

  • 只需了解简单增删改查
  • 麻烦:需要写sql并把返回数据手动封装成json对象

ORM–sequelize

  • object relational mapping 对象—数据库表—映射关系
  • 可以通过对象操作数据库,返回的数据也自动封装成对象
  • 生成数据模型----与表字段对应的一个sequelize-json对象
  • 使用shell脚本生成数据模型—先连接到数据库—生成
  • sequelize-auto:自动生成数据模型对象
  • 执行脚本:sh sequelize-modal.sh 不能在win的命令行中运行
  • 安装:cnpm i -S sequelize@5 mysql2

脚本

  • 工程自动化中使用的非常多, 作用:一键完成所有工作
  • linux—.sh win—.bat java—groovy test—py java—maven/gradle

sequelize-modal.sh脚本文件:

#!/bin/bash
HOST="127.0.0.1"
DB="loan"
USER="root"
PASS="root"
PORT="3306"
DIR="./models"
#JSON_DEFINED="."
EXEC="sequelize-auto -o ${DIR} -d ${DB} -h ${HOST} -u ${USER} -p ${PORT} -x ${PASS} -e mysql"
#EXEC="sequelize-auto -o ${DIR} -d ${DB} -h ${HOST} -u ${USER} -p ${PORT} -x ${PASS} -e mysql -a ${JSON_DEFINED}"#sequelize是node最受欢迎的orm库,普遍使用 Promise. 意味着所有异步调用可以使用 ES2017 async/await 语法.
#sequelize-auto是可以生成sequelize模型的一个工具
#npm install -g sequelize-auto mysql
#-h 数据库的IP地址
#-d 数据库名
#-u 用户名
#-x 密码
#-p 端口
#-t 表名
#-e 数据库类型
#-a  json定义文件路径,可以追加一些自定义配置,如{"timestamps": false}
#sequelize-auto -o . -h localhost -d jindu_loan -u root -x root -p 3306
#run
$EXEC

config.js文件:

//配置文件const config = {//配置环境变量 若有环境变量则使用 否则使用默认的port: process.env.PORT || 3000,//数据库配置db: {database: "loan",username: "root",password: "root",host: "localhost",port: 3306,timezone: "+08:00", //时区dialect: "mysql",  //方言define: {timestamps: false}}
}export default config

数据库----excel表格(类比)
用工具把sql脚本导入excel中 让excel有表头及初始数据
数据模型----数据表 与excel一一对应的数据表格
服务层需要调用数据模型操作数据(增删改查)
生成模型的文件哪里来的,手写的还是安装的?—在sql定义的

脚本生成的模板文件在下图箭头所指文件夹:

在models文件夹下自写index.js文件导出所有模板文件:

//目录根文件
//将所有的数据模型文件都导出
import fs from 'fs'  //node文件系统模块
import path from 'path'  //node文件路径模块
import Sequelize from 'sequelize'   //三方
import config from '../../config/config'  //相对路径--本地
import logger from '../util/logger'const db = {};
const con = config.db;
let sequelize;   //连接数据库try {//连接dbsequelize = new Sequelize(con.database, con.username, con.password, con);logger.info("数据库连接成功")
}catch(e){logger.error("数据库连接失败")throw e;
}//找到数据模型文件,以jd_开头的, 排除index.js
fs.readdirSync(__dirname)  //__dirname当前目录.filter(f => {return f !== 'index.js'}).forEach(f => {//通过sequelize将模型文件导入 f--绝对路径console.log(f)const model = sequelize.import(path.join(__dirname, f))db[model.name] = model; // db.jd_user = model})module.exports = db;

增加服务层(查询数据库放在服务层)


user.service.js文件:

// 用户服务层
import models from '../models'  //  ./models等价于./models/index
const User = models.jd_user;export function findUser(account, pwd) {return User.findOne({where: {account: account,   //左边的名字对应user模型名  右边是参数 password: pwd}})  //findOne--User模型自带的
}

user.ctrl.js文件:(测试findUser方法)

//用户控制器 操作用户的接口
import logger from '../util/logger'
import * as userService from '../service/user.service'const operations = {//用户查询query: function(req, res){logger.info("用户查询开始")userService.findUser("admin", "admin@123").then(data=> {res.status(200).json(data)logger.info("用户查询结束")})},// 用户登录接口login: function(req, res){logger.info("调用用户登录接口开始"+JSON.stringify(req.body))//......let msg = {msg:"登录成功"}res.status(200).json(msg)logger.info("调用登录结束")},// 用户查询列表接口list: function(req, res){//req--request  res-responselogger.info("调用用户查询接口")let users = [{name:"小张"}, {name:"小王"}]//给浏览器返回数据// res.status(200).send(users)res.status(200).json(users)logger.info("调用用户查询接口结束")}
}export default operations

my.route.js添加query接口:

//路由
import express from 'express'
import userCtrl from '../controllers/user.ctrl'const router = express.Router(); //使用express框架自带的路由 类比vue-routerexport default function(app){//控制器接口--需要路由  接口请求方式(get post)//接口定义请求方式: get post delete put//用户        路由地址     请求方式   控制器接口router.route('/user/query').get(userCtrl.query);router.route('/user/list').get(userCtrl.list);router.route('/user/login').post(userCtrl.login);// /api/user/login//权限//合同//把路由配置在myexpress实例上app.use('/api', router);
}

node:ORM、数据模型、脚本创建模型与服务层相关推荐

  1. odoo10参考系列--ORM API 一(记录集、环境、通用方法和创建模型)

    记录集 版本8.0中新东西: 这个在Odoo8.0中新加的API的页面文档应该是不断向前发展的主要开发API.同时它还提供了关于移植或桥接版本7和更早版本的"旧API"的信息,但没 ...

  2. TensorFlow零基础入门指南——计算模型、数据模型、运行模型!

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 正文一共:4110,预计阅读时间:11分钟 本篇文章主要介绍TensorFlow的基本概念,包含TensorFlow ...

  3. 数据库在EF中创建模型

    数据库在EF中创建模型,最简单的理解就是把数据库的字段以及关系映射到项目中,在项目中通过EF框架和LINQ语句直接对数据库数据进行增删改查.下边手把手教你建立模型. 1.建立一个项目,添加新项目,选择 ...

  4. Unity3D 游戏引擎之脚本实现模型的平移与旋转(六)

    Unity3D 游戏引擎之脚本实现模型的平移与旋转 雨松MOMO原创文章如转载,请注明:转载至我的独立域名博客雨松MOMO程序研究院,原文地址:http://www.xuanyusong.com/ar ...

  5. 【django】创建模型类

    一.创建模型类 模型类创建在应用目录/models.py文件中. 模型类必须继承Model类,位于包django.db.models中. 接下来首先以"影片-人物"管理为例进行演示 ...

  6. Asp.Net MVC 模型(使用Entity Framework创建模型类)

    Asp.Net MVC 模型(使用Entity Framework创建模型类) 这篇教程的目的是解释在创建ASP.NET MVC应用程序时,如何使用Microsoft Entity Framework ...

  7. unity双击打不开脚本_游戏对象和脚本 (创建一个时钟)

    该文章是一篇译文,附上原文链接 Game Objects and Scripts​catlikecoding.com 使用简单对象构建一个时钟 编写一个C#脚本 转动时钟的指针来显示时间 创建指针动画 ...

  8. python脚本创建拓扑_Mininet自定义拓扑总结

    1.实验目的 熟悉Mininet自定义拓扑三种实现方式:命令行创建.Python脚本编写.交互式界面创建. 2.实验原理 Mininet 是一个轻量级软件定义网络和测试平台:它采用轻量级的虚拟化技术使 ...

  9. Unity(三十七):3D模型动画、脚本控制模型骨骼IK动画

    效果(左侧模型动画,右侧模型IK控制) 模型动画下载及导入 推荐模型动画下载链接地址 https://actorcore.reallusion.com/ Unity导入教程参见以下链接地址(需要科学上 ...

最新文章

  1. 基于图像的三维物体重建:在深度学习时代的最新技术和趋势综述之三维曲面解码...
  2. StringUtils常用方法+StringUtils详细介绍
  3. 简单实现promise封装
  4. 三个表格居中纵向html,前端技巧集:图与表三步垂直居中
  5. CodeForces - 727D T-shirts Distribution(贪心)
  6. javascript的一些常用正则表达式
  7. 全局配置_配置全局异常处理,结果没有想到,spring boot实践(3)
  8. sql server 里面怎么支持数字使用双引号_国查:用中文编写SQL
  9. ahb总线协议主机_IIC协议学习笔记
  10. 循环,数组,函数作业
  11. 大数据_Spark框架_快速上手_word count 案例-功能实现---Spark工作笔记0007
  12. 【转】winIO的解释与使用
  13. 关于Merge的整理--AndroidScreenSlidePager开源库中用到的
  14. h5 兑换商品 页面模版_H5商城静态页面(模板)
  15. 遗传算法求解TSP问题python实现
  16. CTF古典密码:移位密码
  17. SPSS 随机区组秩和检验
  18. 你一定不知道的 AppStore 秘密
  19. Boost库系列:asio总结
  20. 【10.24】一个只属于程序员的节日

热门文章

  1. hdu 1565 方格取数(1)
  2. webpack编译过程
  3. Leecode05. 最长回文子串——Leecode大厂热题100道系列
  4. 面试官问我圆角边框,我交出了满分的答卷!——Web前端系列学习笔记
  5. clang编译c语言开o优化,针对gcc或clang的LTO可以跨C和C方法进行优化
  6. js java socket_js使用WebSocket,java使用WebSocket
  7. 描述java源程序构成_Java第二章Java程序设计
  8. 免费和开源世界里面有很多好的邮件服务器
  9. c#sort升序还是降序_c# List的sort排序方法详解
  10. python小案例_Python的应用小案例