Node-4

作者: hellomyshadow | 来源:发表于2019-04-21 10:38 被阅读0次

路由与模板引擎

  1. 路由:简单来说就是,根据不同请求的URL,处理不同的业务逻辑;
  2. ESJ模板引擎:是一种后台模板,可以把数据库/文件的读取内容显示到HTML页面上。
    1. 安装:npm i ejs --save
    2. 创建 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)
      
  3. EJS模板语言
    1. 向模板中传递变量:ejs.renderFile() 的第二个参数,如 {name: 'Mack'}
    2. 模板中接收变量:<h2><%= name %></h2>
    3. 在模板中使用 JS 语句:
        <% if(name) { %>
            <h2><%= name %></h2>
        <% } %>
      
      1. 引入公共的模板:<%- include header.ejs %>
      2. 接收HTML数据:<%- html %>
  4. 隐藏表单域传值
    1. 模板中需要使用参数 id,那么就在渲染模板时传递参数 id,在模板中使用隐藏表单域接收此参数
      ejs.renderFile('view/login.ejs', { id: 12 });
      <input type="hidden" id="keyId" value="<%= id %>" />
      
    2. 在模板的<script>中操作DOM,获取隐藏表单域的value值,也就获取了参数id
      let keyId = document.getElementById('keyId');
      let id = keyId.value
      

MongoDB

  1. NoSQL最早在20世纪80年代被提出,属于非关系型数据库,以 key-value 形式存储;
  2. 在如今的大数据时代,NoSQL更多地是强调协助解决大数据等相关问题;
  3. 建议使用NoSQL的情况:对数据库高并发读写、高可扩展性和高可用性的需求,对海量数据的高效率存储和访问的需求。

基本操作

  1. 启动MongoDB
    // 启动服务器端 - windows
    mongod --dbpath F:\mongodbf
    
    // 启动客户端
    mongo
    
    1. --dbpath F:\mongodb 表示指定 mongodb 服务器端的工作目录,保存数据库文件;
    2. 客户端默认 ip127.0.0.1,默认端口号 27017
  2. NodeJs操作MongoDB:npm i mongodb --save
    1. mongodb模块是MongoDB官方为nodeJs提供的驱动,用于nodeJs原生操作MongoDB
      const MongoClient = require('mongodb').MongoClient
      
    2. 数据库的地址:在命令行执行 mongo,会显示地址,如 mongodb://127.0.0.1:27017
  3. NodeJs连接数据库:MongoDB4.04.0 之前的版本是不同的
    1. 主要因为MongoDB官方为nodeJs提供的MongoDB驱动更新了,Driver3.x2.x是不同的
    2. 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()
      
    3. 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() 关闭数据库
      
    4. 查询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()  // 查询结束,关闭数据库
            })
         })
      
    5. 另一种获取 cursor 中的数据、并转为数组的方式:
      cursor.toArray((err, result) => {
         if(!err) {
            console.log('result: ', result)   // result已经是一个数组了
         }
         client.close()
      })
      
  4. ObjectID:MongoDB数据库的 id 是封装后的,不能直接使用,需要借助mongodb 模块的 ObjectID
    let { ObjectID } = require('mongodb')
    find({ _id: new ObjectID('id值') })   // 根据id查询数据
    
  5. MongoDB Compass Community:MongoDB官方提供的可视化管理工具,最新的 MongoDB 自带此工具。

Mongoose

MongoDBODM -- Mongoose
ORM 对象关系映射模型,ODM 文档映射模型

  • 通过关系型数据库的思想来设计非关系型数据库;
  • 基于 MongoDB 驱动,简化操作。

导入与导出

  1. 导出:mongodump -h dbhost -d dbname -o dbdirectory
    1. 导出时需要连接数据库,所以MongoDB服务器端必须运行;
      mongodump -h 127.0.0.1 -d koastu -o D:\users\test
      
    2. 127.0.0.1上的MongoDB数据库koastu,导出到 D:\users\test 目录;
    3. D:\users\test 下会生成一个数据库文件目录 koastu
  2. 导入:mongorestore -h dbhost -d dbname <path>
    1. 导入时不需要运行MongoDB服务器
      mongorestore -h 127.0.0.1 -d koademo D:\users\test\koastu
      
    2. D:\users\test\koastu 中的数据库文件,导入到 127.0.0.1 上的 MongoDB 数据库koademo;如果指定的数据库koademo不存在,MongoDB会自动创建。

性能优化

  1. 插入/删除/更新/查询的操作其实是很快的,而连接数据库的操作却会耗费很长时间;
  2. 性能优化的关键点:保持数据库的长连接,即保存第一次成功连接后的数据库对象
  3. 创建一个单例模式的类:
    class DB {
       static getInstance() {   // 静态方法
          if(!DB.instance) {
             DB.instance = new DB();
          }
          return DB.instance;
       }
       constructor() {
          this.dbClient = null;   // 用于保存数据库对象
       }
    }
    

MySQL

  1. mysql2:第三方MySQL驱动引擎,npm i mysql2 --save
  2. 连接数据库:
    const mysql = require('mysql2/promise');
    let conn = await mysql.createConnection({ 数据库参数 });
    

Sequelize

  1. ORM映射:避免直接写SQL语句,而是用对象模型去操作数据库;
  2. Sequelize:ORM映射模型,支持多种数据库,对于MySQL的操作,底层使用的是mysql2
    npm i mysql2 --save
    npm i sequelize --save
    
    1. 连接数据库:
      const Sequelize = require('sequelize');
      const conn = new Sequelize('数据库名', '用户名', '密码', { 数据库参数 });
      
    2. 数据库参数可以配置域名host、数据库类型dialect,时区timezone
      { host: '117.78.51.252', dialect:'mysql', timezone:'+08:00' }
      
    3. 测试是否连接成功:conn.authenticate();
  3. 定义要操作的表的对象模型
    const User = conn.define('模型名', { 字段参数配置 }, { 可选配置 });
    
    1. 字段参数配置与数据库表的字段要一一对应,建立映射关系;
    2. 默认情况下,模型名 + s 为表名,在可选配置中指定表名
      { freezeTableName:true, tableName:'user', timestamps:false }
      
    3. freezeTableName:设置为true,表示允许通过 tableName 自定义表名;
    4. 如果没有 tableName 自定义表名,则取模型名为表名;
    5. timestamps:设置为false,关闭自动向模型中添加时间戳字段 createAtupdatedAt
  4. 访问数据库的所有数据
    User.findAll().then(res => { ... });
    
  5. 查询并修改
    User.findById(10).then(res => {
       res.set('字段名', '字段值');   // 设置新的字段值
       res.save();   // 保存到数据库中
    });
    
  6. 插入数据
    let zhgsan = User.build({字段名: 字段值, ...});
    zhgsan.set(key, value);   // 重新设置新的值
    zhgsan.save();   // 插入到数据库表中
    

sequelize-cli

  1. sequelize-cli:sequelize的命令行工具,npm i -D sequelize-cli
  2. 初始化
    sequelize init  // 在当前目录下会生成4个目录;
    
    1. config:配置目录,
    2. migrations:迁移文件目录(数据库表结构)
    3. seeders:种子文件目录(生成测试数据)
    4. models:模型文件目录,主要供程序使用
  3. config/config.json中包含三大节点:development(开发)、test(测试)、production(生产)
    1. 配置时区:"timezone": "+08:00"
  4. 创建数据库:在config目录中配置数据库信息,执行 sequelize db:create 生成数据库;
  5. 构建数据迁移结构
    sequelize migration:create --name [迁移文件的名称]
    
    1. migrations 目录中生成相应的JS文件,一个迁移文件对应一个表;
    2. 在迁移文件中配置表结构,再执行生成表的命令;
    3. 第三方日期时间格式化模块:momentjs
  6. 生成表:sequelize db:migrate
  7. 把种子文件的数据导入表中:sequelize db:seed:all

相关文章

  • Node-4

    路由与模板引擎 路由:简单来说就是,根据不同请求的URL,处理不同的业务逻辑; ESJ模板引擎:是一种后台模板,可...

网友评论

      本文标题:Node-4

      本文链接:https://www.haomeiwen.com/subject/ojudgqtx.html