Node.js版MVC之数据库篇

这是该系列的第二篇,上一篇已经选好了技术框架,就得开始操刀敲代码了,下面跟着作者的思路实现数据库的创建和加载

第一步:创建目录

模块主要沿用了后端的模块思想,主要分为 controllerdaoservicedata-sourcemodels,其中models模块用于表达数据表对象,data-source 模块用于表达数据库连接对象

第二步:读取配置文件

该脚手架采用了yaml语言的配置文件,只需将配置文件读取解析出来即可

配置文件如下:

yml 复制代码
base: service
datasource:
  - master:
      url: test.sqlite
      models: models

加载代码如下:

js 复制代码
const fse = require('fs-extra')
const path  = require('path')
const YAML = require('yaml')
/**
 * load the config file
 */
const appFile = fse.readFileSync(path.join(__dirname,'application.yml'), 'utf8')
const config = YAML.parse(appFile)

第三步:创建数据表对象

一个具有ORM特色的数据库框架,最主要的是对象-表的关系的建立,以下代码就是创建了一个 User模型,用于 User对象User表建立映射关系

js 复制代码
module.exports = (sequelize , DataTypes)=> {
  let User = sequelize.define('User',{
    firstName: {
      type: DataTypes.STRING,
      allowNull: false
    },
    lastName: {
      type: DataTypes.STRING
    }
  })
  return User
}

第四步:创建 DataSource

通过配置文件,自动构建DataSource,同时支持多数据源的构建,代码如下:

js 复制代码
const fse = require('fs-extra')
const {Sequelize , DataTypes} = require('sequelize')
const path = require('path')

module.exports =  dataSources => {
  let map = new Map()
  dataSources.forEach( async dataSource => {
    let [name, config] =  Object.entries(dataSource)[0]
    let sequelize = null
    if(!config.dialect || config.dialect === 'sqlite'){
      sequelize = new Sequelize({
        storage: config.url,
        dialect: 'sqlite'
      })
    } else {
    sequelize = new Sequelize({
        url: config.url,
        username:config.username,
        password:config.password,
        dialect: config.dialect
      })
    }
    if(sequelize){
      // 扫描模型文件夹,自动装配数据对象
      let modelFiles = fse.readdirSync(path.join(__dirname,'..', config.models || 'models'))
      modelFiles.forEach(modelFile=>{
         require(path.join(__dirname,'..', config.models || 'models',modelFile))(sequelize,DataTypes)
      })
      await sequelize.sync()
      map.set(name,sequelize)
    }
  })
  return map
}

引入使用

js 复制代码
const createDataSources = require('./data-source')
/**
 * create dataSources
 * @type {Map<any, any>}
 */
const dataSources = createDataSources(config['datasource'])
相关推荐
Benny的老巢2 小时前
【n8n工作流入门02】macOS安装n8n保姆级教程:Homebrew与npm两种方式详解
macos·npm·node.js·n8n·n8n工作流·homwbrew·n8n安装
2301_818732063 小时前
下载nvm后,通过nvm无法下载node,有文件夹但是为空 全局cmd,查不到node和npm 已解决
前端·npm·node.js
亮子AI4 小时前
【MySQL】node.js 如何判断连接池是否正确连接上了?
数据库·mysql·node.js
a程序小傲4 小时前
【Node】单线程的Node.js为什么可以实现多线程?
java·数据库·后端·面试·node.js
程序员爱钓鱼1 天前
Node.js 编程实战:测试与调试 —— Mocha / Jest / Supertest 使用指南
前端·后端·node.js
冴羽1 天前
JavaScript Date 语法要过时了!以后用这个替代!
前端·javascript·node.js
张洪权1 天前
node fs 模块核心 api
node.js
天远数科1 天前
Node.js全栈实战:构建基于天远多头借贷行业风险版API的BFF风控层
大数据·node.js
_Kayo_1 天前
Node.js 学习笔记6
笔记·学习·node.js
winfredzhang1 天前
[实战] Node.js + DeepSeek 打造智能档案归档系统:从混乱到有序的自动化之旅
css·node.js·js·deepseek api