Sequelize.js + Express.js 开发 API
什么是 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 开发 API的更多相关文章
- Node.js + Express + Knex 开发 API 接口
安装依赖包 npm i express knex mysql2 这是 Knex 官方文档地址:Knex.js - SQL query builder. 搭建接口 config.js 新建一个 conf ...
- socket.io+angular.js+express.js做个聊天应用(三)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/www19940501a/article/details/27590611 接着前面博客文章socke ...
- Angular JS + Express JS入门搭建网站
3月份开始,接到了新的任务,跟UI开发有关,用的是Angular JS,Express JS等技术.于是周末顺便学习下新技术. 组里产品UI架构如下: 其中前端,主要使用Angular JS框架,另外 ...
- 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的环境, 采坑无数,特 ...
- 基于 Sequelize.js + Express.js 开发一套 Web 后端服务器
什么是 Sequelize 我们知道 Web 应用开发中的 Web 后端开发一般都是 Java.Python.ASP.NET 等语言.十年前,Node.js 的出现使得原本仅限于运行在浏览器中的 Ja ...
- Node.js + Express + Mongodb 开发搭建个人网站(二)
二.路由 1.打开 routes/index.js ,这个意思就是 捕获到访问主页的get请求: 并通过 app.js 分配到对应的路由里: 看到这里,打开 http://127.0.0.1:300 ...
- 【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 开发搭建个人网站(一)
一.Node + Express环境搭建 0.去Node官网下载安装node,如果安装了 npm 和 node的话 那么就 安装 全局的 express,-g全局安装 npm install expr ...
- socket.io+angular.js+express.js做个聊天应用(一)
node,express开发环境等安装如果已经搞好了. justhacker@justhacker-ThinkPad-Edge-E440:~/projects/nodejs$ express -e c ...
随机推荐
- EPSS 解读:与 CVSS 相比,孰美?
通用漏洞评分系统(CVSS)是当前应用最频繁的评分系统以评估安全漏洞的严重性.但是,由于该系统在评估漏洞和优先级排序方面存在不足而遭受批评.因此,有部分专业人士呼吁使用漏洞利用预测评分系统(EPSS) ...
- 浏览器内存漫游解决方案(js逆向)
//浏览器内存漫游解决方案(js逆向) //原理通过ast把所有的变量,参数中间值进行内存的存储 //搜索AST-hook,进入github //现在github的库下载下来 //anyproxy n ...
- Pointers and Constants
Pointers and Constants char * const q = "abc"; // q is const *q = 'c'; // OK q++; //ERROR ...
- python注释、变量、数据类型详细
目录 1.python注释 2.PEP8规范 3.变量与常量 1.python中的变量 2.变量名的命名规范 3.常量的基本使用 1.python注释 什么是注释? 注释是对代码的解释说明,写注释是为 ...
- 11、lombok日志记录
一.添加依赖: <!--lombok插件--> <dependency> <groupId>org.projectlombok</groupId> &l ...
- 将git仓库从submodule转换为subtree
三个脚本 Alexander Mikhailian cat .gitmodules |while read i do if [[ $i == \[submodule* ]]; then mpath=$ ...
- 体验一个前端视图层的mvvm的框架Knockoutjs(双向绑定,模板..)..解放您的双手,不再处理那么多的dom操作..快速实现视图层数据与UI的交互处理
笔者之前对于类似前端展示的,可能都是自己开发js对象,集合外加dom事件进行处理.. 近期看到相关资料,了解了Knockoutjs这个框架,下面来段代码: <script type=" ...
- 巧用视觉障眼法,还原 3D 文字特效
最近群里有这样一个有意思的问题,大家在讨论,使用 CSS 3D 能否实现如下所示的效果: 这里的核心难点在于,如何利用 CSS 实现一个立体的数字?CSS 能做到吗? 不是特别好实现,但是,如果仅仅只 ...
- node设置下载源
// 设置镜像源 npm config set registry https://registry.npm.taobao.org // 查看当前源 npm config get registry
- 电脑微信小程序抓包
电脑微信小程序抓包 在渗透的过程中,对于网站找不出什么漏洞的时候我们就可以,对目标进行小程序和公众号漏洞的发掘 0x01 设置微信代理使用Burp抓取数据包 发现我们抓取的数据包很多都是乱码 Prox ...