日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2024/1/23 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 node:ORM、数据模型、脚本创建模型与服务层 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • node:ORM、數(shù)據(jù)模型、腳本創(chuàng)建模型與服務(wù)層
    • 控制層
    • 服務(wù)層
    • MYSQL
    • SQL
    • ORM--sequelize
    • 腳本
    • 增加服務(wù)層(查詢數(shù)據(jù)庫(kù)放在服務(wù)層)

node:ORM、數(shù)據(jù)模型、腳本創(chuàng)建模型與服務(wù)層


插一句:若要?jiǎng)h除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"} }

控制層

  • 作用:參數(shù)驗(yàn)證,控制接口的調(diào)用邏輯
  • 流程邏輯比喻:(驗(yàn)證參數(shù)–查詢數(shù)據(jù)庫(kù)–寫(xiě)入redis–生成jwt–返回json)
  • 若把上面每一步代碼代碼都寫(xiě)在控制器,代碼冗余

服務(wù)層

  • 數(shù)據(jù)庫(kù)的操作抽到服務(wù)層
  • 生成jwt抽到一個(gè)工具箱,其它模塊需要直接導(dǎo)入
  • 需要導(dǎo)入數(shù)據(jù)模型,用于操作數(shù)據(jù)庫(kù)

MYSQL

  • 版本5.7.xx, 安裝mysql數(shù)據(jù)庫(kù)
  • 導(dǎo)入sql腳本 表名 列名(字段名) 字段類(lèi)型 數(shù)據(jù)長(zhǎng)度 主鍵(唯一)
  • Navicat Premium 使用工具導(dǎo)入sql,先連接到mysql,創(chuàng)建表初始化數(shù)據(jù)庫(kù)

SQL

  • 只需了解簡(jiǎn)單增刪改查
  • 麻煩:需要寫(xiě)sql并把返回?cái)?shù)據(jù)手動(dòng)封裝成json對(duì)象

ORM–sequelize

  • object relational mapping 對(duì)象—數(shù)據(jù)庫(kù)表—映射關(guān)系
  • 可以通過(guò)對(duì)象操作數(shù)據(jù)庫(kù),返回的數(shù)據(jù)也自動(dòng)封裝成對(duì)象
  • 生成數(shù)據(jù)模型----與表字段對(duì)應(yīng)的一個(gè)sequelize-json對(duì)象
  • 使用shell腳本生成數(shù)據(jù)模型—先連接到數(shù)據(jù)庫(kù)—生成
  • sequelize-auto:自動(dòng)生成數(shù)據(jù)模型對(duì)象
  • 執(zhí)行腳本:sh sequelize-modal.sh 不能在win的命令行中運(yùn)行
  • 安裝:cnpm i -S sequelize@5 mysql2

腳本

  • 工程自動(dòng)化中使用的非常多, 作用:一鍵完成所有工作
  • 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庫(kù),普遍使用 Promise. 意味著所有異步調(diào)用可以使用 ES2017 async/await 語(yǔ)法. #sequelize-auto是可以生成sequelize模型的一個(gè)工具 #npm install -g sequelize-auto mysql #-h 數(shù)據(jù)庫(kù)的IP地址 #-d 數(shù)據(jù)庫(kù)名 #-u 用戶名 #-x 密碼 #-p 端口 #-t 表名 #-e 數(shù)據(jù)庫(kù)類(lèi)型 #-a json定義文件路徑,可以追加一些自定義配置,如{"timestamps": false} #sequelize-auto -o . -h localhost -d jindu_loan -u root -x root -p 3306 #run $EXEC

config.js文件:

//配置文件const config = {//配置環(huán)境變量 若有環(huán)境變量則使用 否則使用默認(rèn)的port: process.env.PORT || 3000,//數(shù)據(jù)庫(kù)配置db: {database: "loan",username: "root",password: "root",host: "localhost",port: 3306,timezone: "+08:00", //時(shí)區(qū)dialect: "mysql", //方言define: {timestamps: false}} }export default config

數(shù)據(jù)庫(kù)----excel表格(類(lèi)比)
用工具把sql腳本導(dǎo)入excel中 讓excel有表頭及初始數(shù)據(jù)
數(shù)據(jù)模型----數(shù)據(jù)表 與excel一一對(duì)應(yīng)的數(shù)據(jù)表格
服務(wù)層需要調(diào)用數(shù)據(jù)模型操作數(shù)據(jù)(增刪改查)
生成模型的文件哪里來(lái)的,手寫(xiě)的還是安裝的?—在sql定義的

腳本生成的模板文件在下圖箭頭所指文件夾:

在models文件夾下自寫(xiě)index.js文件導(dǎo)出所有模板文件:

//目錄根文件 //將所有的數(shù)據(jù)模型文件都導(dǎo)出 import fs from 'fs' //node文件系統(tǒng)模塊 import path from 'path' //node文件路徑模塊 import Sequelize from 'sequelize' //三方 import config from '../../config/config' //相對(duì)路徑--本地 import logger from '../util/logger'const db = {}; const con = config.db; let sequelize; //連接數(shù)據(jù)庫(kù)try {//連接dbsequelize = new Sequelize(con.database, con.username, con.password, con);logger.info("數(shù)據(jù)庫(kù)連接成功") }catch(e){logger.error("數(shù)據(jù)庫(kù)連接失敗")throw e; }//找到數(shù)據(jù)模型文件,以jd_開(kāi)頭的, 排除index.js fs.readdirSync(__dirname) //__dirname當(dāng)前目錄.filter(f => {return f !== 'index.js'}).forEach(f => {//通過(guò)sequelize將模型文件導(dǎo)入 f--絕對(duì)路徑console.log(f)const model = sequelize.import(path.join(__dirname, f))db[model.name] = model; // db.jd_user = model})module.exports = db;

增加服務(wù)層(查詢數(shù)據(jù)庫(kù)放在服務(wù)層)


user.service.js文件:

// 用戶服務(wù)層 import models from '../models' // ./models等價(jià)于./models/index const User = models.jd_user;export function findUser(account, pwd) {return User.findOne({where: {account: account, //左邊的名字對(duì)應(yīng)user模型名 右邊是參數(shù) password: pwd}}) //findOne--User模型自帶的 }

user.ctrl.js文件:(測(cè)試findUser方法)

//用戶控制器 操作用戶的接口 import logger from '../util/logger' import * as userService from '../service/user.service'const operations = {//用戶查詢query: function(req, res){logger.info("用戶查詢開(kāi)始")userService.findUser("admin", "admin@123").then(data=> {res.status(200).json(data)logger.info("用戶查詢結(jié)束")})},// 用戶登錄接口login: function(req, res){logger.info("調(diào)用用戶登錄接口開(kāi)始"+JSON.stringify(req.body))//......let msg = {msg:"登錄成功"}res.status(200).json(msg)logger.info("調(diào)用登錄結(jié)束")},// 用戶查詢列表接口list: function(req, res){//req--request res-responselogger.info("調(diào)用用戶查詢接口")let users = [{name:"小張"}, {name:"小王"}]//給瀏覽器返回?cái)?shù)據(jù)// res.status(200).send(users)res.status(200).json(users)logger.info("調(diào)用用戶查詢接口結(jié)束")} }export default operations

my.route.js添加query接口:

//路由 import express from 'express' import userCtrl from '../controllers/user.ctrl'const router = express.Router(); //使用express框架自帶的路由 類(lèi)比vue-routerexport default function(app){//控制器接口--需要路由 接口請(qǐng)求方式(get post)//接口定義請(qǐng)求方式: get post delete put//用戶 路由地址 請(qǐng)求方式 控制器接口router.route('/user/query').get(userCtrl.query);router.route('/user/list').get(userCtrl.list);router.route('/user/login').post(userCtrl.login);// /api/user/login//權(quán)限//合同//把路由配置在myexpress實(shí)例上app.use('/api', router); } 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的node:ORM、数据模型、脚本创建模型与服务层的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。