导入:使用{{include‘./文件路径’}}可以导入网页,例如:页头和页脚是单独的文件,然后通过模板引擎将它引入。{{include'./header.html'}}//引入页头<div><h1>Hi~</h1></div>{{include'./footer.html'}}//引入页脚继承:1、首先需要创建一个模板文件(layoyt.html),在该文件中留好坑。使用{{block‘名称’}}来留一个坑。{{block'名称'}}<h1>我是h1标题</h1><!--这里可以写也可以不写,写了就是默认内容-->{{/block}}2、然后在子文件中继承这个模板文件,然后填坑(相当于重写)。{{extend'./layout.html'}}<!--继承这个文件-->{{block'名称'}}<!--这里可以重写继承过来的内容-->{{/block}}模板文件:<!DOCTYPEhtml><htmllang="zh"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</title><!--模板继承:css开始-->{{block'css'}}{{/block}}<!--模板继承:css结束--></head><body><!--引入页头开始-->{{include'./header.html'}}<!--引入页头结束--><!--模板继承:主体内容开始-->{{block'content'}}{{/block}}<!--模板继承:主题内容结束--><!--引入页脚开始-->{{include'./footer.html'}}<!--引入页脚结束--><!--模板继承:script开始-->{{block'script'}}{{/block}}<!--模板继承:script结束--></body></html>首页:<!--继承layout这个布局-->{{extend'./layout.html'}}<!--该页面的css-->{{block'css'}}<style>body{background-color:aqua;}</style>{{/block}}<!--该页面的主体内容-->{{block'content'}}<div><h1>fda</h1></div>{{/block}}<!--该页面的script-->{{block'script'}}<script>alert("我是index页面");</script>{{/block}}
例如:文章中要显示作者的名字,那么这个文章表和用户表就产生了关联。步骤:1、在文章表中设置一个用户字段,然后设置类型,但是用户__ID的类型是特殊的。//在文章中设置用户字段author:{//设置类型type:mongoose.Schema.Types.ObjectId,}type(类型):mongoose.Schema.Types.ObjectId2、接着使用ref这个属性来关联用户表的模型。//在文章中设置用户字段author:{//设置类型type:mongoose.Schema.Types.ObjectId,//关联用户表ref:"User"}3、在给文章中author这个字段传入数据时,需要传入一个用户表中的用户__ID。Post.create({author:"61134a307a0157187cb1707d"//传入一个用户表中的id})4、插入完成后,如果直接使用find()方法来查询,author这个字段默认还是显示这个__id,我们需要在find()方法后调用populate("字段")这个方法,在这个方法的参数中传入关联其他表的字段。Post.find().populate("author").then(function(ret){console.log(ret);})//查询显示的内容[{_id:61134bbd37309e0b60aadc42,title:'标题1',content:'内容1',//将这个__id的文档显示了出来author:{_id:61134a307a0157187cb1707d,name:'王大拿',age:30,sex:'男',__v:0},__v:0}]
大于:$gt小于:$lt案例:查询年龄大于20,小于50的数据。模型.find({age:{$gt:20,$lt:50}}).then(function(data){//不知道then是什么的请看Promise文章console.log(data)})匹配包含:$in案例:查询爱好包含踢足球、敲代码的数据。模型.find({hobbies:{$in:['踢足球','敲代码']}}).then(function(data){console.log(data)})结果只返回_查询的字段:查出来的数据.select(‘字段名称1字段名称2’)案例:只返回name和age字段。模型.find().select('nameage').then(function(data){console.log(data)})//只返回name和age字段,默认也显示__id这个字段,其他字段不显示。还可以设置不显示某个字段,直接在字段名前面加一个-即可。模型.find().select('nameage-__id').then(function(data){console.log(data)})//只返回name和age字段,默认返回__id,现在设置不显示__id这个字段。将数据按照某个字段进行升序排序:查出来的数据.sort(‘字段’)案例:将数据按照年龄字段进行升序:模型.find().sort('age').then(function(data){console.log(data);})如果需要降序排序,只需要将字段设置成负(-)的。模型.find().sort('-age').then(function(data){console.log(data);})跳过多少条数据:查出来的数据.skip(数字)查询几条数据:.limit(数字)案例:跳过两条数据,并且限制查询两条数据:模型.find().skip(2).limit(2).then(function(data){console.log(data)})
在创建集合时,可以设置当前字段的验证规则,验证失败就插入失败。type:传入的数据类型required:必选字段当值为true时,说明该字段是一个必填字段。当值为[true,‘该字段是必填项’]时第一个值为true:开启必填。第二个值:如果该字段没传内容,那么就将这个字符当成错误信息返回。required:[true,'该字段为必选项']required:trueminlength:字符串的最小长度,注意:针对字符串minlength:[2,'字符串最小长度为2']//定义长度和自定义错误信息minlength:2//只定义长度maxlength:字符串的最大长度,注意:针对字符串maxlength:[5,'字符串最小长度为2']//定义长度和自定义错误信息maxlength:5//只定义长度min:数字的最小数,注意:针对数字min:[0,'最小数应为0']min:0max:数字的最大数,注意:针对数字max:[100,'最大数应为100']max:100trim:去除字符串两边的空格trim:trueenum:枚举(是否是数组里面的值,如果是就成功,不是就失败)enum:[0,1]//只能是0或者1default:默认值validata:自定义验证器这个是一个属性,它的值是一个对象。对象中有一个validator属性,它的值是一个函数。函数有一个参数,是v,这个v就是给字段传过来的值。这个函数返回一个boolean类型的值。为true就验证成功,为false就验证失败。在这个对象中,还有一个message属性,如果验证失败,message的值就是错误信息。age:{type:Number,//设置类型//自定义验证器validata:{validator:function(v){//这个v参数可以拿到age字段的值returnv>=0&&v<=100;//条件},message:"传入的年龄不符合规范!";}}unique:唯一索引需要将值设置为true才会生效。在往数据库插入数据时,它会传入的这个数据在数据库中是否已经存在,如果存在就不会插入,并且会报一个错误。age:{unique:true}
增删改查操作:0x01添加数据:1、添加数据-通过new的方式:实例.save(function(err,ret){//如果成功:err就是null,如果失败:err就是错误对象。//ret:添加成功的数据});2、添加数据-直接插入(推荐):模型构造函数.create({字段...}).then(function(ret){console.log("插入成功,",ret)//打印添加成功的数据}).catch(function(err){conosle,log("插入失败,",err.message)//打印详情失败信息})0x02查找数据:1、查找数据-显示所有-返回数组:模型构造函数.find(function(){//如果成功:err就是null,如果失败:err就是错误对象。//ret:数据(数组)});2、查找数据-条件查询-返回数组:模型构造函数.find({//返回name为张三的所有数据name:"张三"},function(){//如果成功:err就是null,如果失败:err就是错误对象。//ret:数据(数组)});3、查找一个数据-条件查询-返回对象:模型构造函数.findOne({//返回查到的第一个name为张三的数据,返回的是一个对象name:"张三"},function(err,ret){//如果成功:err就是null,如果失败:err就是错误对象。//ret:数据(对象)});0x03删除数据1、删除数据-删除符合条件的所有数据:模型构造函数.remove({name:"张三"//删除name为张三的所有数据},function(err,ret){});0x04更新数据1、更新数据-根据条件更新所有:模型构造函数.update({name:"张三"},{name:"李四"},function(err,ret){//将所有name为张三的数据,全部更改为李四。});更新数据-更新符合条件的第一个数据:模型构造函数.findOneAndUpdate({name:"张三"},{name:"李四"},function(err,ret){//将查询到第一个name为张三的数据,将name更新成李四});3、更新数据-通过id更新:模型构造函数.findByIdAndUpdate('id',{name:"张三"},function(err,ret){//将这个id的数据中的name字段更改为张三。});
0x01Mongoose:在node.js中,我们使用Mongoose这个第三方包来操作MongoDb数据库,Mongoose这个包封装了MongoDB这个包。安装Mongoose:npminstall--savemongoose0x02Mongoose的使用:node中使用MongoDB数据库-流程大纲:1、导入mongoose包varmongoose=require("mongoose");2、连接数据库mongoose.connect("mongodb://localhost/数据库名");//数据库名不存在也没关系,会自动创建。3、定义SchemavarSchema=mongoose.Schema;4、设计架构(表结构)varuserSchema=newSchema({字段1:{type:类型,required:是否必填,true=是},字段2:{//......}});5、通过mongoose.model()将设计好的表结构转换为模型。返回值:模型构造函数参数1:传入一个首字母大写、单数的名称,mongoose会将传入的这个名称转换为小写、复数(加s)作为你集合(表)的名称。参数2:传入你写好的架构(表结构)。varUser=mongoose.model("User",userSchema);6、然后new模型构造函数来创建一个实例,参数需要写一个对象,内容要和架构的字段一样。var实例=newUser({字段1:"",字段2:""});7、然后就可以通过这个实例来进行增删改查了。
0x01MongoDB下载(3.4.24):下载链接:https://fastdl.mongodb.org/win32/mongodb-win32-x86_64-2008plus-3.4.24-signed.msi0x02MongoDb配置:1、首先找到安装目录,进入/bin目录,然后复制地址,将地址粘贴到用户环境变量的Path中去。2、添加之后可以在cmd中输入mongod--version来检查版本信息,如果正常显示则安装成功。2、在C盘新建一个目录:1、新建目录:data2、在data文件夹中在创建一个db文件夹该目录是数据库的存储目录0x03开启和关闭数据库服务开启://在cmd中输入mongod关闭:在开启服务的cmd中关闭该窗口或者Ctrl+C停止。0x04连接和退出数据库连接:mongo#该命令默认连接本机的MongoDb服务退出:exit#退出连接,数据库服务还是开启着的0x05MongoDB术语数据库:数据库表:集合数据:文档0x06基本命令1、查看显示所有数据库:showdbs2、选择、创建数据库:use数据库名称如果该数据库不存在,那么就会创建一个。如果创建的数据库中没有数据,那么showdbs时,不会显示该数据库。3、查看当前操作的数据库db如果创建的数据库中没有数据,那么showdbs时,不会显示该数据库。4、删除数据库-删除的是当前所在库:db.dropDatabase()5、插入文档:db.集合名.insertOne({"key":"value"})6、查看这个数据库中的集合:showcollections7、查看集合中的数据:db.集合名.find()
异步回调函数:在一些异步方法中,如果想要得要异步方法中的数据,就需要使用回调函数。在node中,经常使用到。定时器案列-错误方法:functionfn(){setTimeout(function(){vari=10;returni;//->行不通,这是将i返回给setTimeout。},1000);}vari=fn();//->行不通,i是undefined。//说明://fn是我们封装好的一个方法,但是现在想调用fn得到定时器中i的值。//如果return的话肯定是行不通的,如果returni的话是将i返回给setTimeout,//但是我们调用的是fn这个函数,fn还是undefined。//解决思路://当定时器时间到达后才会执行setTimeout中的匿名函数//将一个函数当做参数(叫回调函数-callback),传递给fn,//在执行定时器匿名函数时,调用传进来的callback(),//而被传进来的这个匿名函数就需要有一个形参了,接收定时器中callback传进来的实参。定时器案列-正确方法:functionfn(callback){setTimeout(function(){vari=10;//调用回调函数,其实就是调用fn中的匿名函数//将定时器中的i当做实参传过去。callback(i);},1000);}fn(function(i){//在这里就可以操作定时器中的i了。console.log(i);//10});
路由模块的提取:简介:可以将路由模块单独放到一个文件内,在app.js中只负责配置等就可以了,而app.get和ap.post等在路由代码放到单独的文件内。配置路由文件:1、首先在路由文件内引入express框架。//引入express框架varexpress=require("express");2、使用express.Router()创建一个路由实例,以后将get或者post等全部挂载到这个路由实例中。varexpress=require("express");//创建路由实例varrouter=express.Router();3、添加get或者post等路由。varexpress=require("express");varrouter=express.Router();//添加路由router.get('/',function(req,res){res.send("get-/");});//...4、将路由实例使用module.exports导出。varexpress=require("express");varrouter=express.Router();router.get('/',function(req,res){res.send("get-/");});//将路由实例导出module.exprots=router;配置app.js文件使用require()引入路由文件。varrouter=require('路由文件');在合适的位置使用app.use(router)挂载路由。这里的router是一个变量,是在require引入路由文件时赋给的变量。案列:app.js文件//导包varexpress=require("express");//引入路由-这里的index.js可以省略,默认找的就是index文件varrouter=require('./routes/index.js');//创建express的实例:appvarapp=express();//挂载路由app.use(router);//创建端口app.listen(3000,function(){console.log("ServerRuning...");});路由文件//导包varexpress=require("express");//创建路由实例varrouter=express.Router();//配置路由router.get('/',function(req,res){res.send("请求的首页/get");});//将router导出module.exports=router;