路由与模板引擎
- 路由:简单来说就是,根据不同请求的URL,处理不同的业务逻辑;
-
ESJ
模板引擎:是一种后台模板,可以把数据库/文件的读取内容显示到HTML页面上。- 安装:
npm i ejs --save
- 创建
ejs
文件,取代HTML
文件,但ejs
文件的代码格式仍是HTML
;let ejs = require('ejs') http.createServer((req, res) => { res.writeHead(200, {"Content-Type":"text/html;charset='utf-8'"}) ejs.renderFile('view/login.ejs', {}, (err, data) => { res.end(data) // 把ejs模板引擎的渲染的数据,响应给浏览器 }) }).listen(8000)
- 安装:
-
EJS
模板语言- 向模板中传递变量:
ejs.renderFile()
的第二个参数,如{name: 'Mack'}
- 模板中接收变量:
<h2><%= name %></h2>
- 在模板中使用
JS
语句:<% if(name) { %> <h2><%= name %></h2> <% } %>
- 引入公共的模板:
<%- include header.ejs %>
- 接收HTML数据:
<%- html %>
- 引入公共的模板:
- 向模板中传递变量:
- 隐藏表单域传值
- 模板中需要使用参数
id
,那么就在渲染模板时传递参数id
,在模板中使用隐藏表单域接收此参数ejs.renderFile('view/login.ejs', { id: 12 }); <input type="hidden" id="keyId" value="<%= id %>" />
- 在模板的
<script>
中操作DOM
,获取隐藏表单域的value
值,也就获取了参数id
let keyId = document.getElementById('keyId'); let id = keyId.value
- 模板中需要使用参数
MongoDB
-
NoSQL
最早在20世纪80年代被提出,属于非关系型数据库,以key-value
形式存储; - 在如今的大数据时代,
NoSQL
更多地是强调协助解决大数据等相关问题; - 建议使用
NoSQL
的情况:对数据库高并发读写、高可扩展性和高可用性的需求,对海量数据的高效率存储和访问的需求。
基本操作
- 启动
MongoDB
// 启动服务器端 - windows mongod --dbpath F:\mongodbf // 启动客户端 mongo
-
--dbpath F:\mongodb
表示指定mongodb
服务器端的工作目录,保存数据库文件; - 客户端默认
ip
为127.0.0.1
,默认端口号27017
-
-
NodeJs
操作MongoDB:npm i mongodb --save
-
mongodb
模块是MongoDB
官方为nodeJs
提供的驱动,用于nodeJs
原生操作MongoDB
const MongoClient = require('mongodb').MongoClient
- 数据库的地址:在命令行执行
mongo
,会显示地址,如mongodb://127.0.0.1:27017
-
-
NodeJs
连接数据库:MongoDB4.0
与4.0
之前的版本是不同的- 主要因为
MongoDB
官方为nodeJs
提供的MongoDB
驱动更新了,Driver3.x
与2.x
是不同的 -
Driver2.x
操作数据库const url = 'mongodb://127.0.0.1:27017/test' MongoClient.connect(url, (err, db) => { // db表示数据库test的对象 if(err) return; db.connect('user').insertOne({name: 'Jack'}, callback) // 插入一条数据 }) // 在callback中关闭数据库:db.close()
-
Driver3.x
操作数据库:const url = 'mongodb://127.0.0.1:27017' MongoClient.connect(url, (err, client) => { // client表示数据库对象 if(err) return; let db = client.db('test') --> 连接数据库test db.collection('user').insert({name: 'Jack'}, callback) // 插入一条数据 }) // client.close() 关闭数据库
- 查询
MongoDB
官网文档可知,MongoDB NodeJs Driver3.x
查询数据MongoClient.connect(url, (err, client) => { if(err) return; let db = client.db('user') // 连接数据库user let cursor = db.collection('user').find() // 查询出user中的所有数据 let userlist = [] cursor.forEach(doc => { userlist.push(doc) // 把数据保存到一个数组中 }, error => { if(error) { console.log(error) } client.close() // 查询结束,关闭数据库 }) })
- 另一种获取
cursor
中的数据、并转为数组的方式:cursor.toArray((err, result) => { if(!err) { console.log('result: ', result) // result已经是一个数组了 } client.close() })
- 主要因为
-
ObjectID:MongoDB
数据库的id
是封装后的,不能直接使用,需要借助mongodb
模块的ObjectID
let { ObjectID } = require('mongodb') find({ _id: new ObjectID('id值') }) // 根据id查询数据
-
MongoDB Compass Community:MongoDB
官方提供的可视化管理工具,最新的MongoDB
自带此工具。
Mongoose
MongoDB
的 ODM -- Mongoose
ORM
对象关系映射模型,ODM
文档映射模型
- 通过关系型数据库的思想来设计非关系型数据库;
- 基于
MongoDB
驱动,简化操作。
导入与导出
- 导出:
mongodump -h dbhost -d dbname -o dbdirectory
- 导出时需要连接数据库,所以MongoDB服务器端必须运行;
mongodump -h 127.0.0.1 -d koastu -o D:\users\test
- 把
127.0.0.1
上的MongoDB
数据库koastu
,导出到D:\users\test
目录; - 在
D:\users\test
下会生成一个数据库文件目录koastu
- 导出时需要连接数据库,所以MongoDB服务器端必须运行;
- 导入:
mongorestore -h dbhost -d dbname <path>
- 导入时不需要运行
MongoDB
服务器mongorestore -h 127.0.0.1 -d koademo D:\users\test\koastu
- 把
D:\users\test\koastu
中的数据库文件,导入到127.0.0.1
上的MongoDB
数据库koademo
;如果指定的数据库koademo
不存在,MongoDB
会自动创建。
- 导入时不需要运行
性能优化
- 插入/删除/更新/查询的操作其实是很快的,而连接数据库的操作却会耗费很长时间;
- 性能优化的关键点:保持数据库的长连接,即保存第一次成功连接后的数据库对象
- 创建一个单例模式的类:
class DB { static getInstance() { // 静态方法 if(!DB.instance) { DB.instance = new DB(); } return DB.instance; } constructor() { this.dbClient = null; // 用于保存数据库对象 } }
MySQL
-
mysql2:
第三方MySQL驱动引擎,npm i mysql2 --save
- 连接数据库:
const mysql = require('mysql2/promise'); let conn = await mysql.createConnection({ 数据库参数 });
Sequelize
-
ORM
映射:避免直接写SQL
语句,而是用对象模型去操作数据库; -
Sequelize:ORM
映射模型,支持多种数据库,对于MySQL
的操作,底层使用的是mysql2
npm i mysql2 --save npm i sequelize --save
- 连接数据库:
const Sequelize = require('sequelize'); const conn = new Sequelize('数据库名', '用户名', '密码', { 数据库参数 });
- 数据库参数可以配置域名
host
、数据库类型dialect
,时区timezone
{ host: '117.78.51.252', dialect:'mysql', timezone:'+08:00' }
- 测试是否连接成功:
conn.authenticate();
- 连接数据库:
- 定义要操作的表的对象模型
const User = conn.define('模型名', { 字段参数配置 }, { 可选配置 });
- 字段参数配置与数据库表的字段要一一对应,建立映射关系;
- 默认情况下,模型名
+ s
为表名,在可选配置中指定表名{ freezeTableName:true, tableName:'user', timestamps:false }
-
freezeTableName:
设置为true
,表示允许通过tableName
自定义表名; - 如果没有
tableName
自定义表名,则取模型名为表名; -
timestamps:
设置为false
,关闭自动向模型中添加时间戳字段createAt
和updatedAt
- 访问数据库的所有数据
User.findAll().then(res => { ... });
- 查询并修改
User.findById(10).then(res => { res.set('字段名', '字段值'); // 设置新的字段值 res.save(); // 保存到数据库中 });
- 插入数据
let zhgsan = User.build({字段名: 字段值, ...}); zhgsan.set(key, value); // 重新设置新的值 zhgsan.save(); // 插入到数据库表中
sequelize-cli
-
sequelize-cli:sequelize
的命令行工具,npm i -D sequelize-cli
- 初始化
sequelize init // 在当前目录下会生成4个目录;
-
config:
配置目录, -
migrations:
迁移文件目录(数据库表结构) -
seeders:
种子文件目录(生成测试数据) -
models:
模型文件目录,主要供程序使用
-
-
config/config.json
中包含三大节点:development(开发)、test(测试)、production(生产)
- 配置时区:
"timezone": "+08:00"
- 配置时区:
- 创建数据库:在
config
目录中配置数据库信息,执行sequelize db:create
生成数据库; - 构建数据迁移结构
sequelize migration:create --name [迁移文件的名称]
- 在
migrations
目录中生成相应的JS
文件,一个迁移文件对应一个表; - 在迁移文件中配置表结构,再执行生成表的命令;
- 第三方日期时间格式化模块:
momentjs
- 在
- 生成表:
sequelize db:migrate
- 把种子文件的数据导入表中:
sequelize db:seed:all
网友评论