基于 Sequelize.js + Express.js 开发一套 Web 后端服务器
什么是 Sequelize
我们知道 Web 应用开发中的 Web 后端开发一般都是 Java、Python、ASP.NET 等语言。十年前,Node.js 的出现使得原本仅限于运行在浏览器中的 JavaScript 也有了可以开发 Web 后端的机会了。
就对于 MySQL 来说,已经有了偏向于底层的框架 mysql npm 包,但现在要说的是一个基于 Promise 的 Node.js ORM 工具 —— Sequelize.js。结合 Express 来响应 HTTP 请求,定义路由表用于执行不同的 HTTP 请求动作,前端工程师可以基于 Node.js 开发一套服务器。
Sequelize.js 目前支持 Postgres、MySQL、MariaDB、SQLite 以及 Microsoft SQL Server。它具有强大的事务支持、关联关系、预读和延迟加载、读取复制等功能。
ORM 是对象关系映射(Object Relational Mapping)的简称,是一种程序设计技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。其实是创建了一个可在编程语言里使用的“虚拟对象数据库”。
原生 API 的问题
如果 users 和 comments 是一对多的关系。在不使用 Sequelize 框架操作数据库时,对于关联查询,是这样操作的:
let sql = "select u.*, c.u_id, c.content from users as u inner join comments as c on u.id = c.u_id"
connection.query(sql, (err, result, fields) => {
res.send(result)
})
查询每一个用户发表的评论,所以查询的结果为:
点击查看代码
[
{
"id": 1,
"name": "Jane",
"userId": 1,
"content": "内容111"
},
{
"id": 1,
"name": "Jane",
"userId": 1,
"content": "内容222"
},
{
"id": 1,
"name": "Jane",
"userId": 1,
"content": "内容333"
}
]
查询结果显示,只有 content 字段的内容不一致,但结构是重复,我们希望得到的结果是这样的:
[
{
"id": 1,
"name": "Jane",
"userId": 1,
"content": ["内容111", "内容222", "内容333"]
}
]
现在,是时候使用 Sequelize 来连接数据库进行操作了。
基于 Sequelize 开发接口
安装依赖
你需要保证你的项目需要有 mysql2、sequelize、express 三个依赖包,你可以选择一个干净的项目来进行实战。
npm install mysql2 express
连接数据库
导入 express、sequelize
const express = require('express')
const { Sequelize, DataTypes } = require('sequelize')
实例化 sequelize
Sequelize 类有四个构造函数,分别如下:
constructor(database: string, username: string, password?: string, options?: Options);
constructor(database: string, username: string, options?: Options);
constructor(options?: Options);
constructor(uri: string, options?: Options);
Options 定义的是一个 TS 接口,这个接口有更多的数据库配置信息,具体还有什么内容,查看源码。在这里,我选择使用第三个构造函数对数据库进行配置。
const sequelize = new Sequelize({
database: 'test',
username: 'shiramashiro',
password: '123456',
host: 'localhost',
port: 3306,
dialect: 'mysql' // 该字段指定要连接的数据库
})
创建数据表
定义模型
模型是 Sequelize 用于描述 JS 对象与数据库表的映射关系。
const User = sequelize.define('user', {
username: DataTypes.TEXT,
password: {
type: DataTypes.STRING(11),
defaultValue: '123456'
}
})
const Comment = sequelize.define('comment', {
content: DataTypes.TEXT
})
关联模型
在使用关联查询之前,需要让 Sequelize 知道数据库表之间的关系,是一对一,还是一对多,还是多对多。
Sequelize 提供了四种关联方法:HasOne 、BelongsTo 关联类型、HasMany 关联类型、BelongsToMany 关联类型。
根据当前文章案例,我需要使用 HasMay 关联类型和 BelongsTo 关联类型。
/**
* 关联模型,一对多,User 与 Comment 是一对多的关系。
*/
User.hasMany(Comment)
Comment.belongsTo(User)
添加数据
Sequelize 为我们提供了批量添加数据的方法,即 bulkCreate 方法。
点击查看代码
User.bulkCreate([
{
username: 'shiramashiro',
password: '654321'
},
{
username: 'javascript',
password: 'js123456'
}
])
Comment.bulkCreate([
{
content: '内容111',
userId: 1
},
{
content: '内容222',
userId: 1
},
{
content: '内容333',
userId: 1
},
{
content: '内容444',
userId: 2
},
{
content: '内容555',
userId: 2
}
])
关联查询
定义好模型和模型之间的关系之后,我们就可以开始进行关联查询了。
User.findAll({ include: Comment })
.then((result) => {
res.send(result)
})
.catch((error) => {
console.log(error)
})
最后呈现的数据如下:
点击查看代码
[
{
"id": 1,
"username": "shiramashiro",
"password": "654321",
"createdAt": "2021-11-05T10:43:29.000Z",
"updatedAt": "2021-11-05T10:43:29.000Z",
"comments": [
{
"id": 3,
"content": "内容333",
"createdAt": "2021-11-05T10:43:29.000Z",
"updatedAt": "2021-11-05T10:43:29.000Z",
"userId": 1
},
{
"id": 2,
"content": "内容222",
"createdAt": "2021-11-05T10:43:29.000Z",
"updatedAt": "2021-11-05T10:43:29.000Z",
"userId": 1
},
{
"id": 1,
"content": "内容111",
"createdAt": "2021-11-05T10:43:29.000Z",
"updatedAt": "2021-11-05T10:43:29.000Z",
"userId": 1
}
]
},
{
"id": 2,
"username": "javascript",
"password": "js123456",
"createdAt": "2021-11-05T10:43:29.000Z",
"updatedAt": "2021-11-05T10:43:29.000Z",
"comments": [
{
"id": 5,
"content": "内容555",
"createdAt": "2021-11-05T10:43:29.000Z",
"updatedAt": "2021-11-05T10:43:29.000Z",
"userId": 2
},
{
"id": 4,
"content": "内容444",
"createdAt": "2021-11-05T10:43:29.000Z",
"updatedAt": "2021-11-05T10:43:29.000Z",
"userId": 2
}
]
}
]
结合 Express 开发接口
对于上面的查询方法,我们可以设计一个 HTTP API 接口,供前端项目使用。
const express = require('express')
const app = express()
app.get('/', (req, res) => {
User.findAll({ include: Comment })
.then((result) => {
res.send(result)
})
.catch((error) => {
console.log(error)
})
})
app.listen(3000, () => { console.log('server was running at 3000...') })
总结
在编程中,把面向对象的概念跟数据库中表的概念对应起来。ORM 的好处就是不用操作表,可以在程序中用面向对象的思路,直接操作对象即可。Sequelize 基于这样的程序设计技术,为我们提供了大量的可操作数据库的方法。比如 bulkCreate 批量插入数据,我们只需要直接调用方法即可,Sequelize 会自动为我们生成 SQL 语句。
基于 Sequelize.js + Express.js 开发一套 Web 后端服务器的更多相关文章
- Angular JS + Express JS入门搭建网站
3月份开始,接到了新的任务,跟UI开发有关,用的是Angular JS,Express JS等技术.于是周末顺便学习下新技术. 组里产品UI架构如下: 其中前端,主要使用Angular JS框架,另外 ...
- socket.io+angular.js+express.js做个聊天应用(三)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/www19940501a/article/details/27590611 接着前面博客文章socke ...
- soket.io.js + angular.js + express.js(node.js)
soket.io.js + angular.js + express.js(node.js) 今天搭建个soket.io.js + angular.js + express.js的环境, 采坑无数,特 ...
- express:webpack dev-server开发中如何调用后端服务器的接口?
开发环境: 前端:webpack + vue + vue-resource,基于如下模板创建的开发环境: https://github.com/vuejs-templates/webpack ...
- 【nodejs笔记1】配置webstorm + node.js +express + mongodb开发博客的环境
1. 安装webstorm 并破解 2. 安装node (以及express框架) 至官网下载并安装.(http://nodejs.org)v0.10.32 msi 安装后测试,打开命令行, c ...
- Node.js + Express + Mongodb 开发搭建个人网站(三)
三.后台架构 1.在根目录下(和 views 文件夹同级)创建 lib 文件夹 以后所有后端内容 都是在这里写,分别创建三个文件夹 到 lib 目录下: mongo 放的是数据的存储 module ...
- Node.js + Express + Mongodb 开发搭建个人网站(二)
二.路由 1.打开 routes/index.js ,这个意思就是 捕获到访问主页的get请求: 并通过 app.js 分配到对应的路由里: 看到这里,打开 http://127.0.0.1:300 ...
- Node.js + Express + Mongodb 开发搭建个人网站(一)
一.Node + Express环境搭建 0.去Node官网下载安装node,如果安装了 npm 和 node的话 那么就 安装 全局的 express,-g全局安装 npm install expr ...
- Node.js + Express + Knex 开发 API 接口
安装依赖包 npm i express knex mysql2 这是 Knex 官方文档地址:Knex.js - SQL query builder. 搭建接口 config.js 新建一个 conf ...
随机推荐
- Mysql命令行插入字段超长不报错,而jdbc报错问题分析
异常信息 exception.ServiceException: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long ...
- Unicode和中午互转
import java.io.UnsupportedEncodingException; public class TestUnicode{ /* * 中文转unicode编码 */ public s ...
- MySQL、SqlServer、Oracle,这三种数据库的优缺点,你知道吗?
盘点MySQL.SqlServer.Oracle 三种数据库优缺点 MySQL SqlServer Oracle 一.MySQL 优 点 体积小.速度快.总体拥有成本低,开源:支持多种操作系统:是开源 ...
- Linux静默安装Oracle21C
Linux静默安装Oracle21C 1.修改主机名及配置hosts [root@localhost ~]# hostname # 查看主机名 [root@localhost ~]# hostname ...
- SSMS设置为深色模式
更新记录 2022年4月16日:本文迁移自Panda666原博客,原发布时间:2022年2月8日. 2022年4月16日:SSMS很好用,但现在我更多使用DataGrip了. 2022年6月11日:S ...
- Vue回炉重造之封装一个实用的人脸识别组件
前言 人脸识别技术现在越来越火,那么我们今天教大家实现一个人脸识别组件. 资源 element UI Vue.js tracking-min.js face-min.js 源码 由于我们的电脑有的有摄 ...
- 监控pos收银机
1.打开pos收银机snmp功能 控制面板-->程序和功能-->启用或关闭windows功能→简单网络管理协议(SNMP) 2.配置snmp服务 控制面板-->管理工具-->服 ...
- Windows启动谷歌浏览器Chrome失败(应用程序无法启动,因为应用程序的并行配置不正确)解决方法
目录 一.系统环境 二.问题描述 三.解决方法 一.系统环境 Windows版本 系统类型 浏览器Chrome版本 Windows 10 专业版 64 位操作系统, 基于 x64 的处理器 版本 10 ...
- python这不是有手就行?——python音频处理基础知识
大家应该都知道声音的基础吧? 啊不知道当我没说吧~~~ 1.声音的基础 2.python读取.wav音频 Python学习交流Q群:660193417#### import wave import s ...
- 52 条 SQL 语句性能优化策略,建议收藏
本文会提到 52 条 SQL 语句性能优化策略. 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在where及order by涉及的列上建立索引. 2.应尽量避免在where子句中对字段进行nul ...