异步API 不能通过返回值获取,需要通过回调函数
一层回调函数嵌套一层回调函数嵌套一层回调函数嵌套一层回调函数…
解决Node.js 异步编程中回调地狱的问题Promise希望能把异步编程中的执行结果拿到外面进行使用
promise要求我们将原有的异步API放在这个函数中进行
resolve是函数类型 当异步API执行成功以后调用resolve方法
将异步api的执行结果放在resolve函数调用的参数中
reject是函数类型,当异步api执行失败时,调用reject方法
将失败信息传递给reject
当调用完reject后 后续代码不执行了
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 function f1() {
console.log('p1');
}
function f4() {
console.log(111);
}
f1();
f4();
这样就还是按顺序执行
步骤
代码实例
async function fn() {
throw 'errow message';
return 123;
}
fn().then(data=>{console.log(data)})//输出promise类型123
.catch(err=>console.log(err));//输出errow message
这个方法是util模块的方法
使用方式
const promisify = require('util').promisify;
作用
改造现有nodejs中的异步api的,是api的返回值变为 promise对象,从而支持异步函数语法
util.promisify(fs.readFile)
选择这个数据库的原因是因为它的语法也是node 存储的都是对象格式的数据
mysql也能用node操作哦
compass图形界面操作数据库
ndoejs通过API操作数据库
使用第三方模块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里的代码
对集合设置规则
创建集合
创建mongoose.Schema构造函数的实例即可创建集合
在实例对象中传入对象,就是创建规则
使用mongoose.model方法创建集合并应用规则
mongoose.model('集合名称',集合规则);
//返回值是此集合的构造函数,包含很多方法,返回构造函数是为了让我们更好的使用方法
集合名称的首字母要大写
例如
mongoose.model('Course',集合规则);
//实际上在数据库中创建的集合的名词为courses
//创建集合对象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(执行成功时执行的代码))
代码实例
//引入数据库模块
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) });
匹配区间范围
Course.find({age: {$gt:20,$lt:40}})
//查询用户集合中大于20小于40的文档
$gt —> 大于
$lt —> 小于
匹配包含
Course.find({hobbies: {$in:['吃饭']}});
//查询hobbies中包含吃饭的税局
$in -----> 查询字段
数组之间的包含 只能查数组中的包含
匹配查询字段
Course.find().select('name email -_id').then(result=>console.log()result);
//result中只显示name email数据 但是默认会有id数据 -_id就是不显示id
返回数组
对查询的数据进行排序
Course.find().sort('age').then(result=>console.log()result);
//将查找到的数据按照age升序排列,默认升序 降序:sort(’-age’)
返回数组
对查询的数据进行限制\跳过
Course.find().skip(2).limit(2).then(result=>console.log()result);
//跳过skip(n) 默认前n条 limit(n)限制查询的数量 前n条 一般用于分页
返回数组
删除单个
Course.findOneAndDelete({}).then(result=>console.log()result);
//找到一条数据并删除它
返回删除的文档
如果查询条件匹配了多个文档,那么将会删除第一个匹配的文档
删除多个
Course.deleteMany({}).then(result=>console.log()result);
如果传入的为空对象,就是删除所有文档
返回的是对象
{n:n,ok:1}
n是删除n调数据 ok为1是执行成功
更新单个文档
Course.updateOne({查询条件},{要修改的值}).then(result=>console.log()result);
找到要修改的文档并且修改
如果匹配了多条文档,只会删除匹配成功的第一条文档
更新多个文档
Course.updateMany()
Course.updateMany({},{age:300}).then(result=>console.log()result);
将数据库中所有的文档中的age都改为300