美文网首页Nodejs
Section-6 第一批用户入库

Section-6 第一批用户入库

作者: 羽晞yose | 来源:发表于2019-07-19 01:48 被阅读0次

    Lesson-1 NoSQL 简介

    什么是 NoSQL

    • 对不同于传统的关系型数据库的数据库管理系统的统称
      关系型数据库,如mysql

    NoSQL 数据库的分类

    • 列存储(HBase)
    • 文档存储(MongoDB)-- 例如存储json
    • Key-value(Redis)
    • 图存储(FlockDB)
    • 对象存储(db4o)
    • XML存储(BaseX)

    为什么要用 NoSQL

    • 简单(没有原子性、一致性、隔离性等复杂规范)
    • 便于横向拓展
    • 适合超大规模数据的存储
    • 很灵活的存储复杂结构的数据(Schema Free)

    Lesson-2 MongoDB 简介

    什么是 MongoDB

    • 来自于英文单词 "Humoongous",中文含义为庞大
    • 面向文档存储的开源数据库
    • 由 C++ 编写而成

    为什么要用 MongoDB

    • 性能好(内存计算)
    • 大规模数据存储(可拓展性)
    • 可靠安全(本地复制、自动故障转移)
    • 方便存储复杂数据结构(Schema Free)

    MongoDB 下载

    • 官网下载
    • 支持常见平台(Windows、Linux、OSX)

    云 MongoDB

    • 阿里云、腾讯云(收费)
    • MongoDB 官方的 MongoDB Atlas(免费 + 收费)

    Lesson-3 云数据库 -- MongoDB Atlas

    操作步骤

    • 注册用户
    • 创建集群(虚拟服务器)
    • 添加数据库用户
    • 设置 IP 地址白名单
    • 获取连接地址
      自己账号密码备忘暗示(176@q - 167*.tt)
      登录 mongodb官网 自行创建账号,创建集群,选择亚马逊的服务器跟新加波网点(速度会稍微快一点),第一个集群是免费的,后面如果还要增加集群是需要收费的,不过现在只是为了学习,这里步骤比较简单就不截图了
      创建好的集群
      由于新版的已经没有提示了,网上找到的文章都不是新版界面,自己摸索了一番,直接开始吧
    • 选择connect连接,进入后就会要求创建第一个用户,第一个用户是相当于管理员拥有读写权限的。
    • 选择连接的IP地址,第一个是本机,不过我有时候会在其他地方使用,所以选择第二个自定义,写入0.0.0.0任意IP都能连接
    • 接下来选择连接方法,选择第二个Connect Your Application,也就是连接应用程序
    • 最后一步默认即可,这样,后续需要使用的时候就可以直接点击连接,获取到连接地址了
    • 如果需要修改用户,选择Database Access
    • 如果需要修改IP地址,选择Network Access
      到这里就完全ko了

    而我实际是在电脑上安装的MongoDB,有点小曲折,网上文章也不是很实时,这里记录一下安装流程
    下载MongoDB我尝试了各种方法都下不下来,老是下载报错,所以是直接网上下的3.4版本
    安装的时候选择自定义文件夹,否则会默认安装到C盘上,反正个人不愿意


    选择Custom自定义安装路径

    一路Next即可,直到安装结束,我还在该文件夹下建立了一个 data\db 文件夹


    安装完成后的文件夹目录

    因为启动mongodb服务之前需要必须创建数据库文件的存放文件夹,否则命令不会自动创建,而且不能启动成功


    data\db
    到这一步安装及创建目录工作完成,接下来是设置环境变量,我用的win8,直接搜高级系统设置
    win8搜索
    高级系统配置

    点击环境变量


    系统属性
    双击path
    系统属性

    把刚才安装的文件夹目录复制到这里,千万不要跟其他文章说的一样加;号,如果要跟其他文章一样的界面需要点击编辑文本,一路确定回去,这样就可以在电脑的任何地方执行cmd命令都不会报mongod不是内部或外部命令了


    添加环境变量

    启动cmd,执行mongod --dbpath E:\data\db,后面的路径就是我前面创建的 data\db 文件夹路径。为了后续能直接使用mongod.exe直接启动,这里需要将db放在E盘根目录下,而且必须为data/db。
    访问http://localhost:27017/

    安装及启动成功

    安装Robo 3T 实现数据库可视化,这个太简单就不写步骤了


    Lesson-4 使用 Mongoose 连接 MongoDB

    操作步骤

    • 安装 Mongoose
    • 使用 Mongoose 链接 MongoDB

    安装 Mongoose

    执行 npm i mongoose -S 进行安装,需要先看一下 mongoose 官网 文档

    Mongoose 链接 MongoDB

    为了方便管理,这里在index.js文件目录下新建一个config.js目录,用于后续所有需要配置的东西

    // config.js password 填密码,不要留 <> 号
    module.exports = {
        connectionStr: 在线 mongoDB 拿到的连接地址,
        connectionLocal: 'mongodb://localhost:27017/database' // 连接本地mongoDB
    }
    

    连接远程 mongoDB,并监听错误

    const mongoose = require('mongoose');
    const { connectionStr, connectionLocal } = require('./config.js');
    
    // 连接 mongoDB
    // mongoose.connect(connectionStr, { useNewUrlParser: true } , () => console.log('MongoDB 连接成功'));
    mongoose.connect(connectionLocal, { useNewUrlParser: true } , () => console.log('MongoDB 连接成功'));
    // 打印错误信息
    mongoose.connection.on('error', console.error);
    

    接下来,我使用的都是本地MongoDB,因为单纯的不想连接远程,不好查看数据。我会使用本地 MongoDB + Robo 3T,上面我已经把本地跟远程的全都列出来了,任君挑选


    Lesson-5 设计用户模块的 Schema

    操作步骤

    • 分析用户模块的属性
    • 编写用户模块的 Schema
    • 使用 Schema 生成用户 Model

    我们在 app 文件夹下创建一个 models 文件夹,该文件夹用于定义用户模块的数据结构(Schema)及模型(Model)
    Schema:相当于一个数据库的模板。Mongoose 中的所有内容都以 Schema 开头。每个模式都映射到 MongoDB 集合,并定义该集合中文档的数据结构(模板/模式)。
    Model:基本文档数据的父类,通过集成 Schema 定义的基本方法和属性得到相关的内容。要使用我们的模式定义,需要将 Schema 转换为可以使用的模型。为此,我们将其传递给mongoose.model(modelName, schema)

    |- models
      |- user.js
    
    // models/user.js
    const mongoose = require('mongoose');
    
    const { Schema, model } = mongoose;
    
    const userSchema = new Schema({
        name: { type: String, required: true },
        age: { type: Number, default: 0 }
    });
    
    // user代表集合,导出的是一个类
    module.exports = model('user', userSchema);
    
    说不清,直接上图

    Lesson-6 用 MongoDB 实现用户的增删改查

    操作步骤

    • 用 Mongoose 实现增删改查接口
    • 用 Postman 测试增删改查接口

    用 Mongoose 实现增删改查接口

    前面已经在 models/users.js 中设置好了数据模型,并获取对应集合的数据导出,那么接下来只需要在控制器里使用即可。如果到这里不管文档啊,文章啊还是没法理解Schema,那就把它当做是一个格式校验吧,拿 VUE 的 props 去当参照吧,没在模型中的请求体一律被过滤没了,其实要说我真的理解它,我也还是不知道怎么理解这个词才是绝对正确的

    • 重新说一下,运行 npm run start,开启你的服务(你的服务是作为中间层,用来请求操作数据库的)
    • 开启 mongod.exe ,启动 mongoDB 服务
      两者缺一不可,会把 3000 端口与 27017 端口占用,因此还需要注意端口的使用情况
    // controller.js/users.js
    const User = require('../models/users');
    
    class UsersCtl {
        async find (ctx) {
            ctx.body = await User.find();
        }
    
        async findById (ctx) {
            const user = await User.findById(ctx.params.id);
            if(!user) ctx.throw(404, '用户不存在');
            ctx.body = user;
        }
    
        async create (ctx) {
            ctx.verifyParams({
                name: { type: 'string', required: true }
            });
            
            // save方法,保存到数据库。并根据 RESTful API最佳实践,返回增加的内容
            const user = await new User(ctx.request.body).save();
            ctx.body = user;
        }
    
        async update (ctx) {
            ctx.verifyParams({
                name: {
                    type: 'string',
                    required: true
                }
            });
    
            // findByIdAndUpdate,第一个参数为要修改的数据id,第二个参数为修改的内容
            const user = await User.findByIdAndUpdate(ctx.params.id, ctx.request.body);
            if(!user) ctx.throw(404, '用户不存在');
            ctx.body = user;
        }
    
        async delete (ctx) {
            const user = await User.findByIdAndRemove(ctx.params.id);
            if(!user) ctx.throw(404, '用户不存在');
            ctx.status = 204; // 没有内容,但是成功了
        }
    }
    
    module.exports = new UsersCtl();
    

    这里我就不放所有验证截图的,自行操作一下即可。有一点需要说明的,看下面的截图,返回的是原数据,如果想返回的是修改后的数据,那么该方法实际有第三个参数 options,第四个参数 callBack(回调函数,这里就不写了),具体可以查看文档 mongoosejs 文档

    options 可选参数:
    new: Boolean- 默认为false。返回修改后的数据。
    upsert: Boolean- 默认为false。如果不存在则创建记录。
    runValidators: 如果值为true,执行Validation验证。
    setDefaultsOnInsert: 如果upsert选项为true,在新建时插入文档定义的默认值。
    sort: 如果有多个查询条件,按顺序进行查询更新。
    select: 设置数据的返回。

    官方文档截图 修改特定用户

    相关文章

      网友评论

        本文标题:Section-6 第一批用户入库

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