天天看点

学习记录---03nodejs---mongo数据库回调地狱Promise异步函数async关键字await关键字promisifyMongoDB数据库

回调地狱

异步API 不能通过返回值获取,需要通过回调函数

一层回调函数嵌套一层回调函数嵌套一层回调函数嵌套一层回调函数…

Promise

解决Node.js 异步编程中回调地狱的问题Promise希望能把异步编程中的执行结果拿到外面进行使用

promise要求我们将原有的异步API放在这个函数中进行

resolve是函数类型 当异步API执行成功以后调用resolve方法

将异步api的执行结果放在resolve函数调用的参数中

reject是函数类型,当异步api执行失败时,调用reject方法

将失败信息传递给reject

当调用完reject后 后续代码不执行了

用promise解决回调地狱问题

let promise = new Promise((resolve,reject)=>{
//resolve 是一个函数 将异步API的执行结果返回出去
//reject 如果执行失败,就把失败信息传递到外面
});
//成功--->resolve  失败---->reject
promise.then(result=>console.log(result))//这里的result就是resolve返回的结果
.catch(error=>console.log(error))//这里的err就是reject返回的结果
           

异步函数

是异步编程语法的终极解决方案,可以将异步代码写成同步的形式

async关键字

异步函数主要的作用是解决在异步函数中调用异步函数的回调地狱的问题

单独将异步函数调用和普通函数没有什么区别

还是按顺序执行

async function f1() {
  console.log('p1');
}
function f4() {
  console.log(111);
}
f1();
f4();
           

这样就还是按顺序执行

步骤

  1. 在普通函数定义之前加上async关键字, 就变成了异步函数

    async function fn() {}

  2. 异步函数默认的放回值是promise对象
  3. 在异步函数内部使用throw关键字进行抛出错误

    throw ‘’;

    throw后的代码不执行了

代码实例

async function fn() {
  throw 'errow message';
  return 123;
}
fn().then(data=>{console.log(data)})//输出promise类型123
.catch(err=>console.log(err));//输出errow message
           

await关键字

  1. 他只能出现在异步函数中
  2. await后面只能写promise对象,写其他类型的API不行
  3. await promise 他可以暂停异步函数的向下执行 等待promise对象放回结果后再向下执行

promisify

这个方法是util模块的方法

使用方式

const promisify = require('util').promisify;

作用

改造现有nodejs中的异步api的,是api的返回值变为 promise对象,从而支持异步函数语法

util.promisify(fs.readFile)

MongoDB数据库

选择这个数据库的原因是因为它的语法也是node 存储的都是对象格式的数据

mysql也能用node操作哦

compass图形界面操作数据库

ndoejs通过API操作数据库

数据库相关概念

  • database 数据库可以建立多个数据库
  • collection 集合 一组数据的集合
  • document 文档 一条具体的数据 json对象
  • field 字段 文档中的属性名称

在nodejs中操作数据库

  • 使用第三方模块mongoose

    npm install mongoose

  • 启动/关闭数据库服务

    net stop mongodb

    net start mongodb

  • 连接数据库
    mongoose.connect('mongodb://localhost/playground',{useNewUrlParser:true})//如果		没有这个数据库会自动创建
    .then(()=>console.log('数据库连接成功'))
    .catch(err=>console.log('数据库连接失败',err));
    //连接成功则执行then()里的代码  连接失败则执行throw里的代码
               

创建集合

  1. 对集合设置规则
  2. 创建集合

    创建mongoose.Schema构造函数的实例即可创建集合

    在实例对象中传入对象,就是创建规则

  3. 使用mongoose.model方法创建集合并应用规则

    mongoose.model('集合名称',集合规则);

    //返回值是此集合的构造函数,包含很多方法,返回构造函数是为了让我们更好的使用方法
  4. 集合名称的首字母要大写

    例如

    mongoose.model('Course',集合规则);

    //实际上在数据库中创建的集合的名词为courses

创建文档----->向集合中插入数据

  1. 创建集合实例
  2. 调用实例对象下的sava方法将数据保存到数据库中
    //创建集合对象model 返回值Wie几个对象
    let Course = mongoose.model('Course', couseSchema);
    //创建实例对象
    let course = new Course({
     name: 'zhangsan',
     age: 18,
     sex: true
    });
       //应用它
    course.save();
               
    创建文档的第二种方式
    Course.create({集合对象},(err,doc)=> {
      console.log(err);
      console.log(doc);
    })
               

和数据库相关的操作都是异步的

create方法可以用promise 返回值是promise对象

Course.create({集合对象}).then().catch();

代码实例

//引入数据库模块
const mongoose = require('mongoose');
//链接数据库
mongoose.connect('mongodb://localhost/playground', { useNewUrlParser: true })
  .then(() => console.log('数据库连接成功'))
  .catch(err => console.log('数据库连接失败', err));
//创建集合规则
const couseSchema = new mongoose.Schema({
  name: String,
  age: Number,
  sex: Boolean
});
//创建集合对象model 返回值Wie几个对象
let Course = mongoose.model('Course', couseSchema);
//创建实例对象
let course = new Course({
  name: 'zhangsan',
  age: 18,
  sex: true
});
//应用它
course.save();
插入文档的第二种方式
Course.create({ name: 'lisi', age: "20", sex: false }, (err, doc)=>{
  console.log(err);
  console.log(doc);
})
//promise方式
Course.create({ name: 'liu', age: "20", sex: false })
  .then(() => { console.log('success') })
  .catch((err) => console.log(err));
           

如何从数据库中导入数据

要设置环境变量 吧数据库的安装目录下的bin目录放在系统Path环境变量下

mongoimport -d 数据库名称 -c 集合名称 --file 要导入的数据 (-u xxxx(用户名) -p xxxx(密码))

代码实例

mongoimport -d play
ground -c users --file ./user.json
           

查询文档

Course.find(条件).then(callback(执行成功时执行的代码))

  • 条件中是一个对象
  • find查询结果是一个数组
  • 不存在的话是一个空数组
  • Course.findOne()

    返回一条文档,默认返回当前的第一条文档 返回对象

代码实例

//引入数据库模块
const mongoose = require('mongoose');
//链接数据库
mongoose.connect('mongodb://localhost/playground', { useNewUrlParser: true })
  .then(() => { console.log('数据库连接成功') })
  .catch((err) => { console.log('数据库连接失败' + err) });
//创建集合规则
const couseSchema = new mongoose.Schema({
  name: String,
  age: Number,
  sex: Boolean
});
//创建集合对象
let Course = mongoose.model('Course', couseSchema);
//find方法
Course.find({_id:'5d01ac3cc82ab11bc429dc53'})
  .then((res) => { console.log(res) })
  .catch((err) => { console.log(err) });
//findOne方法
Course.findOne().then((res) => { console.log(res) });
           

查询条件的写法

  1. 匹配区间范围

    Course.find({age: {$gt:20,$lt:40}})

    //查询用户集合中大于20小于40的文档

    $gt —> 大于

    $lt —> 小于

  2. 匹配包含

    Course.find({hobbies: {$in:['吃饭']}});

    //查询hobbies中包含吃饭的税局

    $in -----> 查询字段

    数组之间的包含 只能查数组中的包含

  3. 匹配查询字段

    Course.find().select('name email -_id').then(result=>console.log()result);

    //result中只显示name email数据 但是默认会有id数据 -_id就是不显示id

    返回数组

  4. 对查询的数据进行排序

    Course.find().sort('age').then(result=>console.log()result);

    //将查找到的数据按照age升序排列,默认升序 降序:sort(’-age’)

    返回数组

  5. 对查询的数据进行限制\跳过

    Course.find().skip(2).limit(2).then(result=>console.log()result);

    //跳过skip(n) 默认前n条 limit(n)限制查询的数量 前n条 一般用于分页

    返回数组

删除文档

  1. 删除单个

    Course.findOneAndDelete({}).then(result=>console.log()result);

    //找到一条数据并删除它

    返回删除的文档

    如果查询条件匹配了多个文档,那么将会删除第一个匹配的文档

  2. 删除多个

    Course.deleteMany({}).then(result=>console.log()result);

    如果传入的为空对象,就是删除所有文档

    返回的是对象

    {n:n,ok:1}

    n是删除n调数据 ok为1是执行成功

更新文档

  1. 更新单个文档

    Course.updateOne({查询条件},{要修改的值}).then(result=>console.log()result);

    找到要修改的文档并且修改

    如果匹配了多条文档,只会删除匹配成功的第一条文档

  2. 更新多个文档

    Course.updateMany()

    Course.updateMany({},{age:300}).then(result=>console.log()result);

    将数据库中所有的文档中的age都改为300

继续阅读