node.js第五天整理笔记~

Node.js 第5天课堂笔记

sublime快捷键

ctrl + D  		选中相同的单词
ctrl + shift +左右箭头 选中
ctrl + shift +左右箭头  选中并且选择

1.封装ajax方法:

    // setTimeout
    // readFile
    // wirteFile
    // readdir
    // ajax
    // 往往异步 API 都伴随有一个回调函数
    // var ret = fn()
    // $.get('dsadas', fucntion () {})
    // var ret = $.get()

    function get(url, callback) {
      var oReq = new XMLHttpRequest()
      // 当请求加载成功之后要调用指定的函数
      oReq.onload = function () {
        // 我现在需要得到这里的 oReq.responseText
        callback(oReq.responseText)
      }
      oReq.open("get", url, true)
      oReq.send()
    }

    get('data.json', function (data) {
      console.log(data)
    })

2.package.json和package-lock.json

在npm5以前不会有package-lock.json这个文件

npm5以后才有这个文件

当你安装包的时候,都会生成package-lock.json这个文件

  • npm5以后的安装包不需要加--save 参数,会自动保存依赖

  • 当你安装包的时候,会自动安装或者更新package-lock.json这个文件

  • package-lock.json这个文件会保存所有node_moudles中所有包的信息(版本、下载地址)

    • 这样的话,从新npm install 的速度会更快
  • lock

    • 这个lock是用来锁定版本的
    • 若果项目依赖了1.1.1
    • 如果你从新 npm install ,则会下载新版本 而不是1.1.1
    • package-lock.json会锁住1.1.1,防止自动升级

8. MongoDB

8.1 关系型数据库和菲关系型数据库

表就是关系

或者表与表之间存在的关系

  • 所有的关系型数据库都需要通过sql语言来操作
  • 所有的关系型数据库在操作之前都需要设计表结构
  • 而且数据表还支持约束
    • 唯一的
    • 主键
    • 默认值
    • 非空
  • 非关系型数据库非常的灵活
  • 有的非关系型数据库就是key-value键值对
  • MongoDB是长得最像关系型数据库的非关系型数据库
    • 数据库------>数据库
    • 数据表------->集合(数组)
    • 表记录-------->文档对象
  • MongoDB 不需要设计表结构

8.2 安装:

下载

配置环境变量:找到bin目录的路径,放在全局环境变量中,

打开cmd,就可以查询版本

8.3 启动和关闭数据库

启动方式:

#默认使用执行mongodb命令的所处盘符根目录下的/data/db作为自己的数据存储目录
#如果没有这个目录,则数据库启动不成功,需要手动创建目录
mongod

如果想要修改默认的数据存储目录,则可以:

mongod --dbpath=数据存储目录路径

停止:

ctrl + C

8.4 连接和退出数据库

连接:
mongo	//该命令默认连接本地服务
退出:
exit

8.5 基本命令

  • show dbs

    • 查看显示所有数据库
  • db

    • 查看当前操作的数据库
  • user 数据库名

    • 切换到指定数据库(如果没有会创建)
  • 插入数据

  • show collectons

  • db.数据名.find()

8.6 在node中如何操作MongoDB数据库

8.6.1使用官方的mongoDB包来操作

https://www.npmjs.com/package/mongodb

8.6.2使用第三方mongoose来操作MongoDB数据库

8.7mongoose

第三方包:mongoose基于MongoDB的官方mongodb包再做了一次封装

官方网站:http://mongoosejs.com

8.7.1MongoDB数据库基本概念
  • 可以有多个数据库数据库
  • 一个数据库可以有多个集合(数组)
  • 一个集合可以有多个文档
  • 文档结构很灵活,没有任何限制
8.7.2起步

安装:

npm i -S mongoose

hello world

var mongoose = require('mongoose');

// 连接 MongoDB 数据库
mongoose.connect('mongodb://localhost/test', { useMongoClient: true });

mongoose.Promise = global.Promise;
// 创建一个模型
// 就是在设计数据库
// MongoDB 是动态的,非常灵活,只需要在代码中设计你的数据库就可以了
// mongoose 这个包就可以让你的设计编写过程变的非常的简单
var Cat = mongoose.model('Cat', { name: String });
  // 实例化一个 Cat
  var kitty = new Cat({ name: '喵喵'});
  // 持久化保存 kitty 实例
  kitty.save(function (err) {
    if (err) {
      console.log(err);
    } else {
      console.log('meow');
    }
  });

8.7.3官方指南
8.7.3.1设计schema发布moudel
var mongoose = require('mongoose')

var Schema = mongoose.Schema//架构

// 1. 连接数据库
// 指定连接的数据库不需要存在,当你插入第一条数据之后就会自动被创建出来
mongoose.connect('mongodb://localhost/itcast')

// 2. 设计文档结构(表结构)
// 字段名称就是表结构中的属性名称
// 约束的目的是为了保证数据的完整性,不要有脏数据
var userSchema = new Schema({
  username: {
    type: String,
    required: true // 必须有
  },
  password: {
    type: String,
    required: true
  },
  email: {
    type: String
  }
})

// 3. 将文档结构发布为模型
//    mongoose.model 方法就是用来将一个架构发布为 model
//    第一个参数:传入一个大写名词单数字符串用来表示你的数据库名称
//                 mongoose 会自动将大写名词的字符串生成 小写复数 的集合名称
//                 例如这里的 User 最终会变为 users 集合名称
//    第二个参数:架构 Schema
//   
//    返回值:模型构造函数
var User = mongoose.model('User', userSchema)

8.7.3.1增加数据
var admin = new User({
  username: 'zs',
  password: '123456',
  email: '[email protected]'
})

admin.save(function (err, ret) {
  if (err) {
    console.log('保存失败')
  } else {
    console.log('保存成功')
    console.log(ret)
  }
})

8.7.3.2查询数据

查询所有:

User.find(function (err, ret) {
  if (err) {
    console.log('查询失败')
  } else {
    console.log(ret)
  }
})

按条件查询所有:

User.find({
  username: 'zs',
  password:'123456'
}, function (err, ret) {
  if (err) {
    console.log('查询失败')
  } else {
    console.log(ret)
  }
})//按条件查询=====>数组

按条件查询单个:

User.findOne({
  username: 'zs'
}, function (err, ret) {
  if (err) {
    console.log('查询失败')
  } else {
    console.log(ret)
  }
})//按条件查=====>对象

8.7.3.3删除数据

删除所有:

User.remove({
  username: 'zs'
}, function (err, ret) {
  if (err) {
    console.log('删除失败')
  } else {
    console.log('删除成功')
    console.log(ret)
  }
})

根据条件删除一个:

Moudel.findOneAndRemove(conditions,[options],[callback])

根据id删除一个:

Moudel.findByIdAndRemove(id,[options],[callback])

8.7.3.4更新数据

根据条件跟新所有:

Moudel.update(conditions,doc,[options],[callback])

根据指定条件跟新:

Moudel.findOneAndUpdate([conditions],[update],[options],[callback])

根据id更新一个:

User.findByIdAndUpdate('5a001b23d219eb00c8581184', {
  password: '123'
}, function (err, ret) {
  if (err) {
    console.log('更新失败')
  } else {
    console.log('更新成功')
  }
})

9. 异步编程

9.1 回调函数

node.js第五天整理笔记~_第1张图片
不成立的情况:

function add(x, y) {
    
	console.log(1)

	setTimeout(function () {
    	console.log(2)
    
    	var ret = x + y
    	return ret
	}, 1000)
	console.log(3)//到这里就执行结束了,不会等后面的定时器。直接返回默认的值undefined
}
console.log(add(1, 2))//----->undefined
//执行顺序:1---3---undefined-----2

不成立的情况:

function add(x, y) {
    var ret
	console.log(1)

	setTimeout(function () {
    	console.log(2)
    	ret = x + y
	}, 1000)
	console.log(3)
    return ret
}
console.log(add(1 , 2))//----->undefined
//执行顺序:1---3---undefined-----2

回调函数:

function add(x, y, callback) {
    //var x = 10;
    //var y = 20;
    //var callback = function(ret){ console.log(ret)}
  console.log(1)
  setTimeout(function () {
    var ret = x + y
    callback(ret)
  }, 1000)
}

add(10, 20, function (ret) {
  console.log(ret)
})

基于原生HTTPRequest封装get方法:

function get(url, callback) {
      var oReq = new XMLHttpRequest()
      // 当请求加载成功之后要调用指定的函数
      oReq.onload = function () {
        // 我现在需要得到这里的 oReq.responseText
        callback(oReq.responseText)
      }
      oReq.open("get", url, true)
      oReq.send()
    }

    get('data.json', function (data) {
      console.log(data)
    })

9.2Promise

callback hell:(回调地狱)

node.js第五天整理笔记~_第2张图片

异步读取文件,无法保证顺序的代码:

var fs = require('fs')

fs.readFile('./data/a.txt', 'utf8', function(err, data) {
  if (err) {
    // return console.log('读取失败')
    // 抛出异常
    //    1. 阻止程序的执行
    //    2. 把错误消息打印到控制台
    throw err
  }
  console.log(data)
})
fs.readFile('./data/b.txt', 'utf8', function(err, data) {
  if (err) {
    // return console.log('读取失败')
    // 抛出异常
    //    1. 阻止程序的执行
    //    2. 把错误消息打印到控制台
    throw err
  }
  console.log(data)
})
fs.readFile('./data/c.txt', 'utf8', function(err, data) {
  if (err) {
    // return console.log('读取失败')
    // 抛出异常
    //    1. 阻止程序的执行
    //    2. 把错误消息打印到控制台
    throw err
  }
  console.log(data)
})

通过回调嵌套的方式保证顺序:

var fs = require('fs')

fs.readFile('./data/a.txt', 'utf8', function (err, data) {
  if (err) {
    // return console.log('读取失败')
    // 抛出异常
    //    1. 阻止程序的执行
    //    2. 把错误消息打印到控制台
    throw err
  }
  console.log(data)
  fs.readFile('./data/b.txt', 'utf8', function (err, data) {
    if (err) {
      // return console.log('读取失败')
      // 抛出异常
      //    1. 阻止程序的执行
      //    2. 把错误消息打印到控制台
      throw err
    }
    console.log(data)
    fs.readFile('./data/c.txt', 'utf8', function (err, data) {
      if (err) {
        // return console.log('读取失败')
        // 抛出异常
        //    1. 阻止程序的执行
        //    2. 把错误消息打印到控制台
        throw err
      }
      console.log(data)
    })
  })
})

为了解决以上代码带来的问题(回调嵌套),所以EcmaScript6中新增了一个API,promise

  • 英文:保证
  • promise本身不是异步,但是内部往往是异步的。

Promise基本语法:

var fs = require('fs')

var p1 = new Promise(function (resolve, reject) {
  fs.readFile('./data/a.txt', 'utf8', function (err, data) {//异步任务
    if (err) {
      reject(err)//失败
    } else {
      resolve(data)//成功
    }
  })
})
p1
  .then(function (data) {//then方法中的第一个参数function就是容器中的resolve函数
    console.log(data)
  }, function (err) {//then方法中的第二个参数function就是容器中的reject函数
    console.log('读取文件失败了', err)
  })

封装Promise版本的readFile:

var fs = require('fs')

function pReadFile(filePath) {
  return new Promise(function (resolve, reject) {
    fs.readFile(filePath, 'utf8', function (err, data) {
      if (err) {
        reject(err)
      } else {
        resolve(data)
      }
    })
  })
}
pReadFile('./data/a.txt')
  .then(function (data) {
    console.log(data)
    return pReadFile('./data/b.txt')
  })
  .then(function (data) {
    console.log(data)
    return pReadFile('./data/c.txt')
  })
  .then(function (data) {
    console.log(data)
  })


9.5 在Express中配置使用express-session插件

安装:

npm install express-session

配置:

//该插件为req请求对象加上一个成员,:req.session默认是一个对象
//这是最简单的配置方式,暂且不关心里面参数的含义
app.use(session({
	secret: 'keyboard cat',//配置加密字符串,在原有加密基础上,加上
	//这个字符串,目的是为了安全性提高,防止客户端恶意伪造
	resave: false,
	saveUninitialized: true//无论你否使用session,默认分给你一把钥匙
}))

使用:

//添加session数据:
req.session.foo = 'bar'

//访问session数据:
req.session.foo

提示:默认session是内存存储的,服务器一旦重启,数据就会丢失,一般的生产环境会对session数据进行持久存储。

你可能感兴趣的:(node.js第五天整理笔记~)