node:ORM、数据模型、脚本创建模型与服务层
文章目录
- 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、数据模型、脚本创建模型与服务层相关推荐
- odoo10参考系列--ORM API 一(记录集、环境、通用方法和创建模型)
记录集 版本8.0中新东西: 这个在Odoo8.0中新加的API的页面文档应该是不断向前发展的主要开发API.同时它还提供了关于移植或桥接版本7和更早版本的"旧API"的信息,但没 ...
- TensorFlow零基础入门指南——计算模型、数据模型、运行模型!
点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 正文一共:4110,预计阅读时间:11分钟 本篇文章主要介绍TensorFlow的基本概念,包含TensorFlow ...
- 数据库在EF中创建模型
数据库在EF中创建模型,最简单的理解就是把数据库的字段以及关系映射到项目中,在项目中通过EF框架和LINQ语句直接对数据库数据进行增删改查.下边手把手教你建立模型. 1.建立一个项目,添加新项目,选择 ...
- Unity3D 游戏引擎之脚本实现模型的平移与旋转(六)
Unity3D 游戏引擎之脚本实现模型的平移与旋转 雨松MOMO原创文章如转载,请注明:转载至我的独立域名博客雨松MOMO程序研究院,原文地址:http://www.xuanyusong.com/ar ...
- 【django】创建模型类
一.创建模型类 模型类创建在应用目录/models.py文件中. 模型类必须继承Model类,位于包django.db.models中. 接下来首先以"影片-人物"管理为例进行演示 ...
- Asp.Net MVC 模型(使用Entity Framework创建模型类)
Asp.Net MVC 模型(使用Entity Framework创建模型类) 这篇教程的目的是解释在创建ASP.NET MVC应用程序时,如何使用Microsoft Entity Framework ...
- unity双击打不开脚本_游戏对象和脚本 (创建一个时钟)
该文章是一篇译文,附上原文链接 Game Objects and Scriptscatlikecoding.com 使用简单对象构建一个时钟 编写一个C#脚本 转动时钟的指针来显示时间 创建指针动画 ...
- python脚本创建拓扑_Mininet自定义拓扑总结
1.实验目的 熟悉Mininet自定义拓扑三种实现方式:命令行创建.Python脚本编写.交互式界面创建. 2.实验原理 Mininet 是一个轻量级软件定义网络和测试平台:它采用轻量级的虚拟化技术使 ...
- Unity(三十七):3D模型动画、脚本控制模型骨骼IK动画
效果(左侧模型动画,右侧模型IK控制) 模型动画下载及导入 推荐模型动画下载链接地址 https://actorcore.reallusion.com/ Unity导入教程参见以下链接地址(需要科学上 ...
最新文章
- 基于图像的三维物体重建:在深度学习时代的最新技术和趋势综述之三维曲面解码...
- StringUtils常用方法+StringUtils详细介绍
- 简单实现promise封装
- 三个表格居中纵向html,前端技巧集:图与表三步垂直居中
- CodeForces - 727D T-shirts Distribution(贪心)
- javascript的一些常用正则表达式
- 全局配置_配置全局异常处理,结果没有想到,spring boot实践(3)
- sql server 里面怎么支持数字使用双引号_国查:用中文编写SQL
- ahb总线协议主机_IIC协议学习笔记
- 循环,数组,函数作业
- 大数据_Spark框架_快速上手_word count 案例-功能实现---Spark工作笔记0007
- 【转】winIO的解释与使用
- 关于Merge的整理--AndroidScreenSlidePager开源库中用到的
- h5 兑换商品 页面模版_H5商城静态页面(模板)
- 遗传算法求解TSP问题python实现
- CTF古典密码:移位密码
- SPSS 随机区组秩和检验
- 你一定不知道的 AppStore 秘密
- Boost库系列:asio总结
- 【10.24】一个只属于程序员的节日
热门文章
- hdu 1565 方格取数(1)
- webpack编译过程
- Leecode05. 最长回文子串——Leecode大厂热题100道系列
- 面试官问我圆角边框,我交出了满分的答卷!——Web前端系列学习笔记
- clang编译c语言开o优化,针对gcc或clang的LTO可以跨C和C方法进行优化
- js java socket_js使用WebSocket,java使用WebSocket
- 描述java源程序构成_Java第二章Java程序设计
- 免费和开源世界里面有很多好的邮件服务器
- c#sort升序还是降序_c# List的sort排序方法详解
- python小案例_Python的应用小案例