近两日的笔记整理 MongoDB + mqsql + Peomise 课堂案例
表就是关系,或者说表与表之间存在关系
sql
语言来操作键值对
MongoDB中文文档
https://www.runoob.com/mongodb/mongodb-tutorial.html
启动:
# 注意: mongdd 默认使用执行 mongod 命令所处盘符根目录下的 /data/db 作为自己的数据存储目录
mongod
# 如果想要修改默认的数据存储目录。可以:
mongod --dbpath=数据存储目录路径
停止:
# 在开启服务的控制才,ctrl+c
# 或者直接关闭
连接:
mongo
退出:
exit
show dbs
db
use 数据库名称
插入数据
mongodb
包来使用mongoose
来操作MongoDB第三方包: mongoose
基于mongodb
包再次封装。
{
qq:{
shuju1:[
],
....
},
taobao:{
},
baidu:{
}
}
安装:
npm i mongoose
hello world:
const mongoose = require('mongoose');
// 连接mongodb数据库
mongoose.connect('mongodb://localhost:27017/test', { useNewUrlParser: true, useUnifiedTopology: true });
/* 创建一个模型
即使在设计数据库
它是动态的非常灵活,只需要在代码中设计
*/
// 实例化cat
const Cat = mongoose.model('Cat', { name: String });
// 持久化保存 kitty 实例
const kitty = new Cat({ name: 'Zildjian' });
kitty.save().then(() => console.log('meow'));
// 连接数据库
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
// 指定连接的数据库不需要存在,当你插入第一条数据之后就会自动被创建出来
mongoose.connect('mongodb://localhost/itcast');
/* 设计集合结构(表结构)
字段名称就是表结构中的属性名称
约束的目的是为了保证数据的完整性,不要有脏数据 */
var userSchema = new Schema({
username: {
type: String,
require: true
},
password: {
type: String,
required: true
},
email: {
type: String
}
});
// 3.将文档结构发布为模型
/* mongoose.model 方法就是用来将一个架构发布为 model
第一个参数:传入一个大写名词单数字符串用来表示你的数据库名称, mongoose 会自动将大写名词的字符串生成 小写复数 的集合名称;
例如这里的 Uer 最终会变成 users 的集合名称
第二个参数: 架构 Schema
返回值:模型构造函数 */
var User = mongoose.model('User', userSchema);
// 4.当我们有了模型构造函数之后,就可以这个构造函数对 User 集合中的数据可以为所欲为了
期间要确保数据库已经在 cmd
开启
var admin = new User({
username: 'admin',
password: '123',
email: '[email protected]'
});
admin.save(function(err, ret) {
if (err) {
console.log('保存失败');
} else {
console.log('保存成功');
}
})
// -----查询数据------
// User.find(function(err, ret) {
// if (err) {
// console.log('查询失败');
// } else {
// console.log(ret);
// }
// });
// 按条件查询,我要查 name 为 zs 的
// User.find({
// username: 'zs'
// },
// 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);
}
}); // 返回的结果直接就是一个对象
根据条件删除所有:
// ------删除数据------
// 还有 remove 方法。但是现在有一些已经废除了,少用
// 现在还是用 `deleteMany` 或者 `deleteOne` 方法比较多
User.deleteMany({
// 有多少个 zs 全部都一起删除掉
username: 'zs1'
},
function(err, ret) {
if (err) {
console.log('删除失败');
} else {
console.log('删除成功');
console.log(ret);
}
});
根据条件删除一个:
Model.findOneAndRemove(conditions,[options],[callback]);
根据 id 删除一个:
Model.findByIdAndRemove(id,[options],[callback]);
// ------g更新数据----
// findByIdAndUpdate 方法比较老
User.findOneAndUpdate('5f01fae13d2e5c10f830b428', {
username: '22222'
}, function(err, ret) {
if (err) {
console.log('更新失败');
} else {
console.log('更新成功');
}
});
npm i mysql
var mysql = require('mysql');
// 1.创建连接
var connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'root',
database: 'users' //这里不小心把数据库名字和表明一样
});
// 2.连接数据库
connection.connect();
// 3.执行数据操做
connection.query('SELECT * from `users`', function(error, results, fields) {
if (error) throw error;
console.log('The solution is: ', results);
});
// connection.query('INSERT INTO users VALUES(NULL,"admin","123456")', function(error, results, fields) {
// if (error) throw error;
// console.log('The solution is: ', results);
// });
// 4.关闭连接
connection.end();
callback hell
// 回调地狱案例
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) {
throw err
}
console.log(data);
});
fs.readFile('./data/c.txt', 'utf8', function(err, data) {
if (err) {
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);
// a 读完了再读 b
fs.readFile('./data/b.txt', 'utf8', function(err, data) {
if (err) {
throw err
}
console.log(data);
// b 读完了再读 c
fs.readFile('./data/c.txt', 'utf8', function(err, data) {
if (err) {
throw err
}
console.log(data);
})
});
});
但是这种方法,难维护。
为了解决以上编码方式带来的问题,所以在 ES6 中新增一个 API:Primise
。
const { promises, fstat } = require("fs")
var fs = require('fs');
// 在 es6 中新增了 一个 API promises 是构造函数
console.log(1);
// 1.创建 promise 容器
// 1.1 给别人一个承诺,容器一旦创建,就开始执行里面的代码
var p1 = new Promise(function(resolve, reject) {
console.log(2);
fs.readFile('../data/a.txt', 'utf-8', function(err, data) {
if (err) {
// 失败了 表示这容器中的任务失败了
// console.log(err);
reject(err); // 把容器的 pending 状态变为 Rejected
} else {
// console.log(3);
// // 成功了 表示这容器中的任务成功了
// console.log(data);
// 把容器的 Pending 状态改为成功的 Resolve
resolve(data);
}
});
});
// console.log(4); // 1243 aaa
// 当 p1 成功了,然后(then) 做指定的操作
// then 方法接受的 fun 就是容器中的 resolve 函数!!注意
p1.
then(function(data) {
console.log(data);
}, function(err) {
// then 方法接受的 fun 就是容器中的 reject 函数!!注意
console.log(err);
})
var fs = require('fs');
// 在 es6 中新增了 一个 API promises 是构造函数
// 1.创建 promise 容器
// 1.1 给别人一个承诺,容器一旦创建,就开始执行里面的代码
var p1 = new Promise(function(resolve, reject) {
fs.readFile('../data/a.txt', 'utf-8', function(err, data) {
if (err) {
// 失败了 表示这容器中的任务失败了
// console.log(err);
reject(err); // 把容器的 pending 状态变为 Rejected
} else {
// console.log(3);
// // 成功了 表示这容器中的任务成功了
// console.log(data);
// 把容器的 Pending 状态改为成功的 Resolve
resolve(data);
}
});
});
var p2 = new Promise(function(resolve, reject) {
fs.readFile('../data/b.txt', 'utf-8', function(err, data) {
if (err) {
reject(err); // 把容器的 pending 状态变为 Rejected
} else {
resolve(data);
}
});
});
var p3 = new Promise(function(resolve, reject) {
fs.readFile('../data/c.txt', 'utf-8', function(err, data) {
if (err) {
reject(err); // 把容器的 pending 状态变为 Rejected
} else {
resolve(data);
}
});
});
// console.log(4); // 1243 aaa
// 当 p1 成功了,然后(then) 做指定的操作
// then 方法接受的 fun 就是容器中的 resolve 函数!!注意
p1
.then(function(data) {
console.log(data);
// 当 p1 成功的时候,这里 return 什么,下面的then 的data 就是什么
// return 123
// 注意:当你 返回123 后面就接收到123 你传 p2 为一个 Promise 对象的时候,后续的 then 中的方法的第一个参数会作为 p2 的 resolve
return p2
}, function(err) {
// then 方法接受的 fun 就是容器中的 reject 函数!!注意
console.log(err);
})
.then(function(data) {
console.log(data); //这里得到的就是上个then 返回的 123
return p3
})
.then(function(data) {
console.log(data);
})
var fs = require('fs');
function pReadFild(filePath) {
return new Promise(function(resolve, reject) {
fs.readFile(filePath, 'utf-8', function(err, data) {
if (err) {
reject(err); // 把容器的 pending 状态变为 Rejected
} else {
resolve(data);
}
});
});
}
pReadFild('../data/a.txt')
.then(function(data) {
console.log(data);
return pReadFild('../data/b.txt')
})
.then(function(data) {
console.log(data); //这里得到的就是上个then 返回的 123
return pReadFild('../data/c.txt')
})
.then(function(data) {
console.log(data);
})
此课程没有课件资源,都是手动整理,多少有出入。。