mongoose验证
在创建集合规则是,可以设置当前字段的验证规则,验证失败就输出插入失败
required:true 必填项
设置验证规则
const postSchema = new mongoose.Schema ({
title:{
type:String,
required:true
//required:[true,'自定义错误信息']
,minlength:2,//minlength:[2:'']
maxlength:5,
trim:true//自动去除字符串两边的空格
},
age :{
type: Number,
min: 10,
max: 30
},
inDate: {
type: Date,
default: Date.now//传入数据是若没有传入,系统自动填写的默认项
},
category: {
type: String,
//enum: ['html','css','node','javascript']//枚举,列举出当前字段可以拥有的值,输入的项必须是这个数组中的数据
enum: {
value:['html','css','node','javascript'],
message:'自定义错误信息'
}
},
author: {
type: String,
validate: {
validator : v=> {
//返回布尔值
//true 验证成功
//false 验证失败
//v 要验证的值
return v&&v.lenght>4
},
//自定义错误信息
message:'';
}
}
})
const Post = mongoose.model('Post',postSchema);
Post.create({title:})
minlength maxlength
是 String类型的验证格式
min max
是Number
捕获错误信息
const Post = mongoose.model('Post',postSchema);
Post.create({title:}).then(res=>console.log(res))
.catch(err => {
//获取错误信息对象
const error = err.errors;
//循环错误信息对象
for(var attr in err){
//打印错误信息
console.log(err[attr]['message]);
}
})
集合关联
不同集合的数据之间是有联系的
- 使用id对集合进行关联
author: { type :mongoose.Schema.Types.ObjectId, ref:'要关联的集合' }
就会在author中存储所关联集合的id
.find().populate(要查询的关联字段信息)
模板引擎
第三方模块
art-template
腾讯
告诉模板引擎要拼接的数据和模板在哪
const html = template('模板路径',对象数据);
返回值就是拼接好的字符串
代码实例
const template = require('art-template');
//引用path
const path = require('path');
//获取index.art的绝对路径
let url = path.join(__dirname, 'views', 'index.art');
//模板引擎使用
const a = template(url, {
name: "张三",
age: 20
});
console.log(a);
art中要显示对象中的信息语法
{{name}}
{{age}}
模板语法(标准语法和原始语法)
原始语法中是可以使用原生js的
-
输出 将某项数据输出在模板中
标准语法:{{数据}}
原始语法:<%= 数据 %>
可以在数据中写表达式 -
原文输出(数据中要是有html标签,模板引擎默认是不解析的 所以使用原文输出)
标准语法:{{@数据}}
原始语法:<%-数据%>
-
条件判断
- 标准语法
多条件执行{{if 条件}}条件满足执行的代码 {{/if}}
{{if()}}
条件满足执行的代码
{{else if 条件}}
条件满足执行的代码
{{/if}}
- 原始语法
<% if() { %>
条件满足执行的代码
<% else if (条件){%>
条件满足执行的代码
<% else {%>
执行的代码
<% } %>
- 标准语法
-
循环
-
标准语法
{{each 数据}} 语句{{/each}}
原始语法
<% for() { %> <% } %>例子
user = [{name:'1},{name:2},{name:3}]; {{each user}} {{$value}} {{/each}}
这里的$ value 就是循环user数组时的每个对象 可以用$value.name获取到name值
-
-
子模板
使用子模板可以将网站公共区块(头部、底部)抽离到单独的文件中。
标准语法:{{include ‘模板路径’}}
原始语法:<% include(‘模板路径’)%> -
模板继承
可以将网站HTML骨架抽离到单独的文件中,其他页面模块可以继承骨架文件
语法
{{extend '文件路径'}}
在模板中还会有预留的位置用
{{block head}}{{/block}}
语法预留出来
在继承时用{{block head}}HTML代码{{/block}}
将继承模板中的预留的位置填起来 -
模板配置
向模板中导入变量template.defaults.imports.自定义属性 = 方法对象;
就可以对模板当中的数据进行处理了
配置模板的默认后缀
template.default.extname='.art'
处理日期格式的第三方模块 dateformat(需要处理的时间,设置时间的格式)
Express框架
基于node平台的web开发框架
特性
提供了方便简洁的路由定义方式
对获取HTTP请求参数进行了简化处理
对模板引擎的支持度高,方面渲染HTML页面
提供了中间件(对请求的拦截)机制有效控制HTTP请求
拥有大量第三方中间件对功能进行扩展
步骤
- 下载第三方模块
- 创建服务器时 直接使用express()方法
例如 const app = express();
send方法
- send方法内部会检测响应内容的的文档类型
- send方法会自动设置http状态码
- send方法会自动设置响应的内容类型编码
send方法中不仅可以传入字符串 还能传入json对象
get方法
get('地址(/)',()=>{})
两个方法的使用代码
const express = require('express');
//创建服务器
const app = express();
app.get('/', (req,res) => {
res.send('hello node express');
})
app.listen(3000, () => { console.log('服务库开启成功') });
中间件
就是express提供的一些方法,可以接受客户端发来的请求,可以对请求做出相应,也可以将请求继续交给下一个中间件,由下一个中间件对服务器做出反应
方法和处理请求函数
中间件方法是有express提供,负责拦截请求,请求处理函数有开发人员提供,负责处理请求
app.get('请求路径','处理函数')//接收并处理请求
对于同一个请求可以设置多个中间件
默认情况下请求从上到下一次匹配执行,一旦匹配成功,终止匹配
可以调用next方法将请求的控制权交给下一个中间件,直到遇到结束请求的中间件
代码示例
app.get('/request',(req,res,next)=>{
req.name = '张三';
next();
});
app.get('/request',(req,res) => {
res.send(req,name);
})
app.use之间件用法
app.use 匹配所有的请求方式 可以直接传入请求处理函数,代表接收所有的请求。
app.use(’/admin’,(req,res,next)=>{})
app.use第一个参数也可以传入请求地址,代表不论什么请求方式,只要是这个请求地址就接收这个请求
中间件应用
- 路由保护 客户端在访问需要登录的页面时,可以先使用中间件判断用户登录状态,用户如果没有登录,则拦截请求,直接响应禁止用户进入的页面
- 网站维护公告,在所有路由的最上面定义接收所有请求的中间件,直接为客户端做出响应。
- 自定义404页面
res.status(404)设置状态码
错误处理中间件
是一个集中处理错误的地方
app.status(500).send('服务器发生未知错误')
app.use((err,req,res,next)=>{
res.status(500).send('服务器发生未知错误');
})
err错误对象中有以一个message
保存错误信息
有一个内置的构造函数Error
创建一个这个实例就是创建了一个错误
错误处理中间件,只能主动捕获到同步代码的错误,不能主动捕获到异步代码
异步代码发生错误时,调用next()
方法,并且将错误信息通过参数的形式传递给next()方法,即可触发错误处理中间件
try{
可能会出错的代码
}catch(e){
console.log(e.message)//调用错误处理中间件 显示错误信息
}
可以捕获到同步 异步函数在执行过程中方式的错误 但是不能捕获到其他类型API发生的错误
补充
- 重定向的状态码是301
res.writeHead(301,{
Location:'/list'//指定的跳转页面
});
res.end();//重定向后要调用res.end()告诉客户端请求结束
-
数组下有一个includes方法 查看数组是否在这个数组中
-
在html中/就代表绝对路径,外链文件类似于css就用/路径/文件.css
-
两个路由地址一样,但是一个是get 一个是post get是呈递页面 post传输数据
-
隐藏域 input type = hidden
用于携带数据到服务器端