nodejs-03

异步处理

  • nodejs中很多程序都是异步的,如何处理多个异步程序的执行顺序
  • 解决回调地狱常用方式:promise、async/await、插件。。。
// promise封装
function test(){
  return new Promise((resolve,reject)=>{
    fs.writeFile('hehe.txt','hello',(err)=>{
      if (err) {
        reject('写入失败')
      } else {
        resolve('写入成功')
      }
    })
  })
}

MongoDB 非关系型数据库

  • 1.下载安装包:https://www.mongodb.com/download-center/community

  • 2.安装流程:

    • next
    • 勾选同意 -> next
    • 选择complete
    • 去掉Install MongoDB as a Service -> next
    • 去掉Install MongoDB Compass -> next
    • install …
    • finish
  • 3.在cmd中执行 mongod 启动数据库(保留当前终端窗口,等待连接),提示缺少目录:c:\data\db 需要自己创建

  • 4.在cmd中执行 mongo 连接操作数据库,执行 show dbs,显示数据库,安装成功!!!

  • 注意:提示找不到命令,需要去配置系统环境变量(配置完重启cmd后执行3 4)

  • 配置系统环境变量:C:\Program Files\MongoDB\Server\4.2\bin

SQL术语/概念	MongoDB术语/概念	解释/说明
database	    database	        数据库
table	        collection	        数据库表/集合
row	           document	        数据记录行/文档
column	       field	            数据字段/域
index	         index	            索引
table           joins	 	        表连接,MongoDB不支持
primary key	    primary key	     主键,MongoDB自动将_id字段设置为主键
  • mongodb存储的是文档,且文档是json格式的对象,所以增删改查都必须是json格式对象
指令:
    mongod  启动数据库(保留当前终端窗口,等待连接)
    mongo   连接操作数据库

    show dbs    查看所有数据库
    db  查看当前数据库
    use mydb    切换到指定数据库(不存在则创建数据库)
    db.dropDatabase()   删除当前数据库(注意切换到指定数据库)

    show collections    查看当前数据库已有集合()
    db.createCollection("users")    创建集合()
    db.users.drop()    删除当前数据库中的users集合

    db.users.insert({name:'xm',age:23,sex:1})  向集合中插入文档(集合不存在会被自动创建)
    
    db.users.remove({'title':'123'})   删除所有title为123的数据
    db.users.remove({'title':'123'},1)   删除1条title为123的数据
    db.users.remove({})   删除所有数据

    db.users.update({'title':'123'},{$set:{'title':'456'}})    更新集合内容

    db.users.find()  查询当前集合所有内容
    db.users.find({key1:value1})  查询当前集合指定内容
    db.users.find({age:{$gt:25}}) 查询age大于25的文档
    db.users.find({age:{$lt:25}}) 查询age小于25的文档
    db.users.find({age:{$ne:25}}) 查询age不等于25的文档
    db.users.find({age:{$in:[20,25]}}) 查询age为2025的文档
    db.users.find({$or:[{age:{$gt:22}},{sex:1}]}) 查询age大于22 或 sex为1的文档
    db.users.find({$and:[{age:{$gt:22}},{sex:1}]}) 查询age大于22 且 sex为1的文档
    db.users.find({name:/m$/}) 正则表达式查询name结尾是m的文档

可视化操作工具

  • 安装:Robo 3T

  • mongoose模块,node操作数据的插件

  • 文档:http://mongoosejs.net/docs/index.html

  • 安装:npm install mongoose

  • mongoose 的一切始于 Schema

  • 通过schema[ˈskiːmə]对象来操作数据库

// 引入模块
const mongoose = require('mongoose')
// 连接数据库test
// mongoose.connect('mongodb://localhost/test')// 比较老的语法,会有警告,但不影响使用
mongoose.connect('mongodb://localhost/test', { useNewUrlParser: true,  useUnifiedTopology: true })// 添加一个配置项,不会有警告
// 数据库链接对象
let db = mongoose.connection
// 监听连接失败事件
db.on('error', console.error.bind(console, 'connection error:'))
// 监听连接成功事件
db.once('open', function() {
  console.log('--------- db connect ok ----------')
})

// 创建一个和集合相关的schema对象(需要几张表就创建几个schema对象)
let userSchema = new mongoose.Schema({
  us: {type:String,required:true},
  ps: {type:String,required:true},
  age: {type:Number,default:99},
  sex: {type:Number,default:0}
})
// 将schema对象转化为数据模型
// mongoose.model('表名/集合名', schema对象)
let User = mongoose.model('users', userSchema)// 使用User来进行增删改查

// 增加数据
User.insertMany({user:'小王',pass:'777888',age:23,sex:1})
.then((data)=>{
  console.log('插入成功');
  console.log(data);
})
.catch((err)=>{
  console.log(err);
})

// 删除数据
User.remove({age:18})
.then((data)=>{
  console.log('删除成功');
  console.log(data);
})
.catch((err)=>{
  console.log(err);
})

// 修改数据
User.update({user:'xiaohong'},{age:18})
.then((data)=>{
  console.log('修改成功');
  console.log(data);
})
.catch((err)=>{
  console.log(err);
})

// 查询数据
User.find({age:17})
.then((data)=>{
  console.log('查询成功');
  console.log(data);
})
.catch((err)=>{
  console.log(err);
})

登录/注册接口

  1. 接收数据
  • body-parser解析消息体
  • 空值判断,格式验证
  1. 处理数据
  • 登录,查询数据,返回结果长度大于0
  • 注册,先查询数据是否已存在,再插入数据
  1. 返回数据
  • 根据执行结果,返回相应的数据

发送邮箱验证码

  1. 发送邮箱验证码
  2. 把验证码缓存下来
  3. 注册时校验验证码
  • 思考:
    如何防止用户频繁发送验证码?

  • 地址:https://apidocjs.com/

  • 安装:npm install apidoc -g

  • 写注释:拷贝文档上的实例

  • 生成api文档:apidoc -i ./router -o ./apidoc

  • 说明:编译当前目录下router文件夹中的所有文件,输出到当前目录下的doc文件夹中

  • 项目根目录创建 apidoc.json

{
  "name": "用户",
  "version": "0.1.0",
  "description": "用户登录、注册接口文档",
  "title": "接口文档",
  "url" : "http://127.0.0.1:3000"
}
  • 注释示例:
/**
 * @api {post} /file/upload 上传图片
 * @apiGroup file
 *
 * @apiParam {String} upfile 要上传图片数据的key值
 *
 * @apiSuccessExample 返回数据示例:
 * {
 *     "err": 0,
 *     "msg": "ok 上传成功",
 *     "imgurl": "/static/uploads/upfile-1589360718128-12365.jpg"
 * }
 */
©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页