Node.js02--05

关于js模块化问题

  • js天生不支持模块化
    • require
    • exports
    • Node.js才有的
  • 在浏览器中也可以像在Node中的模块一样来进行编程
    • require.js第三方库 CMD
    • sea.js 第三方库 AMD
    • 通过script标签来进行引用加载,而且还必须考虑加载顺序的问题
  • 无论是CommonJS、AMD、CMD、UMD、ES6 Module官方规范
    • 都是为了解决js的模块化问题
    • CommonJS、MD、CMD都是民间搞出来的
    • ES是官方规范定义
    • 官方看民间在乱搞,开发人员为了在不同的环境中使用js模块化解决方案
    • 所以ES2016,ES6,其中包含了官方对js模块化的支持

package-lock文件的作用

  • app.use()不仅仅是可以用来加载静态资源的和,还可以做很多工作
  • 配置body-parse也是通过app.use来配置的
  • 这是一个中间件,中间有一套规则

npm5以前是不会有package-lock文件的,只有npm5以后才有这个文件。,当安装包的时候,都会生成或者更新package-lock.jspom文件。

  • npm5以后的版本安装包不需要加–save参数,它会自动保存依赖信息
  • 当安装包的时候,会自动创建或者更新package-lock.json文件
  • package-lock.json这个文件会保存node_modules中所有包的信息,(版本、下载地址)
    • 这样的话chongxinnpm install的时候速度就会提升
  • 从文件来看,有一个lock称之为锁
    • 这个lock是用来锁定版本的,
    • 如果项目依赖了1.1.1版本,如果重新install其实会下载最新版本,而不是1.1.1
    • 我们的目的就是希望可以锁住1.1.1这个版本
    • 所以这个package-lock.json这个文件的另外一个作用就是锁定版本,防止升级版本

find和findIndex原理

  • find接受一个方法作为参数,方法内部返回一个条件
  • find会遍历所有的元素,执行你给定的带有条件返回值的函数
  • 符合该条件的元素会作为find方法的返回值
  • 如果遍历结束还没有符合该条件的元素,则返回undefined
  • 如果遍历到该元素符合条件了,就停止向下遍历
  • findIndex不过是返回的元素匹配的下标,而find返回的是元素匹配的元素值

MongoDB

基本概念

  • 数据库,可以有多个数据库,qq,baidu,taobao
  • 集合,一个数据库中可以有多个集合users,products
  • 文档,一个集合中可以有多个文档{},{},{},{}
  • 文档结构很灵活,没有任何限制
  • mongodb非常灵活,不需要向MySQL一样先创建数据库、表、设计表结构
    • 在这里只需要:当需要插入数据的时候,只需要指定往哪个数据库的哪个集合中操作就可以了
    • 一切都有mongodb帮助完成建库建表这件事
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      {
      qq:{
      users:[
      {name:'a'},
      {name:'a'},
      {name:'a'},
      {name:'a'}
      ],
      products:[
      ],
      ……

      },
      baidu:{

      },
      taobao:{

      }
      }

关系型数据库和非关系型数据

  • 表就是关系,或者说表与表之间存在关系
    • 所有的关系型数据库都需要通过sql语言来操作
    • 所有的关系型数据库都需要在操作之前设计表结构
    • 而且数据表还支持约束
      • 唯一的、主键、默认值、非空
  • 非关系型数据库非常的灵活,是灵活的
    • 有的非关系型数据库就是key-value对儿
    • MongoDB是长得最像关系型数据库的非关系型数据库
      • 数据库-》数据库
      • 数据表-》集合(数组)
      • 表记录-》(文档对象)
    • MongoDB不需要设计表结构
    • 也就是说你可以任意的往里面存数据,没有结构性这么一说

启动和关闭数据库

启动:

1
2
3
4
#mongodb 默认执行mongodb命令所处盘符根目录下的 /data/db作为自己的数据存储目录
# 所以在第一次执行该命令之前先自己手动创建一个/data/db目录

mongod

如果想要修改默认的数据存储目录

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

停止

1
在开启服务的控制台,直接ctrl+c即可停止。或者直接关闭开启服务的控制台也可以

链接数据库

1
mongo //该命令默认链接本机的mongoDB服务

退出:在链接状态输入 exit

基本命令

  • show dbs
    • 查看所有数据库
  • db
    • 查看当前操作的数据库
  • use 数据库名称
    • 切换到指定的数据库(如果没有会新建)
  • 插入数据

在node中如何操作mongodb

使用官方mongodb包来操作

网址:https://github.com/mongodb/node-mongodb-native

使用第三放mongoose来操作mongodb数据库

第三方包:mongoose基于mongodb官方的mongodb包再做了一次包装
安装:nom i mongoose
网址:mongodbjs.com

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//引包
var mongoose = require('mongoose');
//连接ongodb数据库
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:'zilding'});

//持久化保存kitty实例
kitty.save(function(err){
if(err){
console.log(err);
} else {
console.log('meow');
}
});

写在一个js文件中,该js文件是放在node_modules中的
demo案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

//新增数据
var mongoose = require('mongoose');

//1、链接数据库,括号里的localhost后的可以是不用存在的数据库,当插入第一条数据的时候,会自动创建
mongoose.connect('mongodb://localhost/test');

//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);


//4、当我们有了这个模型构造函数以后,就可以使用这个构造函数对users集合中的数据为所欲为了
var admin = new User({
ursername:'admin',
password:'123456',
email:'admin@admin.com'
})

保存数据

1
2
3
4
5
6
7
admin.save(function(err,ret){
if(err){
console.log('保存失败')
} else {
console.log('保存成功')
}
})

查询数据

查询所有数据

1
2
3
4
5
6
7
8
9
10
11

//查询数据

//该方法时查询全部数据
User.find(function(err,ret){
if(err){
console.log('查询失败')
}else {
console.log(ret)
}
})

按条件查询数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
	//按照条件查询
User.find({
username:'zs',
password:'1234556' //花括号以内的就是查询条件
},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)
}
})

删除数据

根据条件删除所有

1
2
3
4
5
6
7
8
9
User.remove({
uername:'zs' //把所有username为zs的都删除了
},function(err,ret){
if(err){
console.log('删除失败')
} else {
console.log(ret)
}
})

根据条件删除一个:

1
Model.findOneAndRemove(conditions,[options],[callback])

根据id删除一个

1
Model.findByIdAndRemove(id,[options],[callback])

更新数据

1
2
3
4
5
6
7
8
9
User.findByIdAndUpdate('sdsd',{
password:'123445'
},function(err,ret){
if(err){
console.log('更新失败')
} else {
console.log('更新成功')
}
})
-------------本文结束感谢您的阅读-------------