术语 | 解释说明 |
---|---|
database | 数据库,mongoDB数据库软件中可以建立多个数据库 |
collection | 集合,一组数据的集合,可以理解为JavaScript中的数组 |
document | 文档,一条数据的数据,可以理解为JavaScript中的对象 |
field | 字段,文档中的属性名称,可以理解为JavaScript中的对象属性 |
npm install mongoose
命令下载net start mongoDB
即可启动mongoDB,否则mongoDB无法连接const mongoose = require('mongoose')
mongoose.connect('moongodb://localhost/playground')
.then(()=>{console.log('success')})
.catch(err=>console.log('fail', err))
数据库创建
// 设定集合规则
const courseSchema = new mongoose.Schema({
name: String,
author: String,
isPublish: Boolean
})
//创建集合并应用规则
const Course = mongoose.model('Course', courseSchema) // courses
// 创建集合实例
const course = new Course({
name:'Node.js course',
author: 'Billy',
isPublish: true
})
// 将数据库保存到数据库中
course.save()
方法二
Course.create({
name:'JavaScript基础',
author:'Billy',
isPublish: true
},(err, doc)=>{
// 错误对象
console.log(err)
// 当前插入的文档
console.log(doc)
})
---------------------------
Course.create({
name:'JavaScript基础',
author:'Billy',
isPublish: true
})
.then(doc=>console.log(doc))
.catch(err=>console.log(err))
mongoDB数据库导入数据
mongoimport -d 数据库名称 -c 集合名称 --file 要导入的数据文件
找到mongodb数据库的安装目录,将安装目录下的bin目录放置在环境变量中
查找所有文档
// 根据条件查找文档
Course.find().then(result=>console.log(result))
// 返回文档集合
[{},{}]
查找一条文档
// 根据条件查找文档
Course.findOne({name:'JavaScript基础'})
.then(res=>console.log(res))
// 返回文档
{}
模糊查找
// 匹配大于 小于
User.find({age:{$gt:20, $lt:50}}).then(res=>console.log(res))
// 匹配包含
User.find({hobbies: {$in: ['敲代码']}}).then(res=>console.log(res))
// 选择要查询的字段
User.find().select('name email').then(res=>console.log(res))
// 将数据库按照年龄进行排序
User.find().sort('age').then(res=>console.log(res))
// skip跳过多少数据 limit限制查询数量
User.find().skip(2).limit(2).then(res=>console.log(res))
// 删除单个
Course.findOneAndDelete({}).then(res=>console.log(res))
// 删除多个
Course.deleteMany({}).then(res=>console.log(res))
// 更新单个
User.updateOne({查询条件}, {要修改的值}).then(res=>console.log(res))
// 更新多个
User.updateMany({查询条件},{要更改的值}).then(res=>console.log(res))
创建集合规则时,可以设置当前字段的验证规则,验证失败就输入插入失败
required:true
必传字段
minlength:3
字符串最大长度为2
maxlength:20
字符串最大长度为20
min:2
数值最小为2
max:100
数值最大为100
enum:['html','css','javascript','node.js']
枚举(只能输入列举的数据)
trim:true
去除字符串两边的空格
validate
:自定义验证器
default
:默认值
获取错误信息:error.errors[‘字段名称’].message
// 用户集合
const User = mongoose.model('User', new mongoose.Schema({
name: {
type: String
}
}))
// 文章集合
const Post = mongoose.model('Post', new mongoose.Schema({
title: {
type: String
}
// 使用id将文章集合和作者集合进行关联
author:{type:mongoose.Schema.Types.ObjectId, ref:'User'}
}))
// 联合查询
Post.find().populate('author').then((err, result)=>console.log(result))
npm install art-template
命令进行下载const template = require('art-template')
引入模板引擎const html = template(模板路径', 数据')
// 导入模板引擎模块
const template = require('art-template')
// 将特定模板与特定数据进行拼接
const html = template('./views/index.art', {
data: {
name:'张三',
age: 20
}
})
<div>
<span>{{ data.name }}</span>
<span>{{ data.age }}</span>
</div>
<!--标准语法-->
<h2>{{value}}</h2>
<h2>{{a?b:c}}</h2>
<h2>{{ a + b}}</h2>
<!--原始语法-->
<h2><%= value %></h2>
<h2><%= a ? b : c %></h2>
<h2><%= a + b %></h2>
原文输出
<!--标准语法-->
<h2>{{ @ value }}</h2>
<!--原始语法-->
<h2><%- value></h2>
条件判断
<!--标准语法-->
{{if 条件}}.......{{/if}}
{{if v1}}....{{else if v2}}....{{/if}}
<!--原始语法-->
<% if (value) { %> ... <% } %>
<% if (v1) { %> ... <% } else if (v2) { %> ... <%} %>
循环
<!--标准语法-->
{{ each target }}
{{ $index }} {{$value}}
{{ /each }}
<!--原始语法-->
<% for(var i = 0; i < target.length; i++){ %>
<%= i%> <%= target[i] %>
<% } %>
子模板
<!--标准语法-->
{{ include './header.art' }}
<!--原始语法-->
<% include('./header.art') %>
模板继承
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
{{blcok 'head'}}
{{/blcok}}
</head>
<body>
{{block 'content'}}
{{/block}}
</body>
</html>
<!-- 首页 -->
{{extend './layout.art'}}
{{blcok 'head'}}
<link rel="stylesheet" href="index.css">
{{/blcok}}
{{blcok 'content'}}
<p>this is the content</p>
{{/blcok}}
template.defaults.imports.变量名 = 变量值
template.defaults.root = 模板目录
template.defaults.extname= '.art'
npm install express
命令进行下载// 引入express框架
const express = require('express')
// 使用框架创建web服务器
const app = express();
// 当客户端以get方式访问路由时
app.get('/', (req, res)=>{
// 对客户端做出响应
res.send('Hello Express')
})
// 监听3000端口
app.listen(3000)
-------------------------
// 引入express框架
const express = require("express");
// 创建网站服务器
const app = express();
app.get("/", (req, res) => {
// send方法内部会检测响应内容的类型
// send方法会自动设置http状态码;
// send方法会自动设置响应的内容类型及编码;
res.send({ name: "Billy", age: 19 });
});
// 监听端口
app.listen(3000);
console.log("网站服务器启动成功");
app.get('请求路径', '处理函数') // 接收并处理get请求
app.post('请求路径', '处理函数') // 接收并处理post请求
app.get('/request', (req, res, next)=>{
req.name - 'zhangsan',
next()
})
app.get('/request', (req, res)=>{
res.send(req.name)
})
app.use中间件的用法
app.use
匹配所有的请求方式,可以直接传入请求处理函数,代表接收所有的请求app.use((req, res, next)=>{
console.log(req.url)
next()
})
app.use
第一个参数也可以传入请求地址,代表不论什么请求方法,只要是这个请求地址就接收这个请求app.use('/admin', (req, res, next)=>{
console.log(req.url)
next()
})
// 引入express框架
const express = require("express");
// 创建网站服务器
const app = express();
app.use((req, res, next) => {
console.log("请求走了app.use中间件");
next();
});
app.use("/request", (req, res, next) => {
console.log("请求走了app.use /request中间件");
next();
});
app.get("/list", (req, res, next) => {
req.name = "张三";
next();
});
app.get("/request", (req, res) => {
res.send(req.name);
});
// 监听端口
app.listen(3000);
console.log("网站服务器启动成功");
中间件的应用
app.use((err, req, res, next)=>{
res.status(500).send('服务器发生未知错误')
})
-----------------
// 引入express框架
const express = require("express");
// 创建网站服务器
const app = express();
// app.use((req, res, next) => {
// res.send("网站正在维护");
// });
app.use("/admin", (req, res, next) => {
let isLOgin = true;
if (isLOgin) {
next();
} else {
res.send("您还没登录");
}
});
app.get("/admin", (req, res) => {
res.send("您已经登录");
});
app.use((req, res, next) => {
// res.status(404);
res.status(404).send("404");
});
// 监听端口
app.listen(3000);
console.log("网站服务器启动成功");
app.get('/', (req, res, next)=>{
fs.readFile('/file-docs-not-exist', (err, data)=>{
if(err){
next(err)
}
})
})
捕获错误
app.get('/', async (req, res, next)=>{
try {
await User.find({name:'张三'})
}catch(ex){
next(ex)
}
})
模块化路由
// home.js
const home = express.Router()
home.get('/index', ()=>{
res.send('welcome')
})
module.exports = home
// app.js
const home = require('./route/home')
app.use('/home', home)
req.query
即可获取GET参数,框架内部会将GET参数转换为对象并返回// http://localhost:3000/?name=zhangsan
app.get('/', (req, res)=>{
console.log(req.query) //{"name":"zhangsan"}
})
// 引入body-parse模块
const bodyParse = require('body-parse')
// 配置body-parse模块
app.use(bodyParse.urlencoded({extended: false}))
// 接收请求
app.post('/add', (req, res)=>{
// 接收请求参数
console.log(req.body)
})
----------------------------
const express = require("express");
const bodyParse = require("body-parser");
const app = express();
// extended:false方法内部使用queryString模块处理请求参数的格式
// extended:true方法内部使用第三方模块qs模块处理请求参数的格式
app.use(bodyParse.urlencoded({ extended: false }));
app.post("/index", (req, res) => {
console.log(bodyParse);
// body就是bodyParse在req中添加的一个属性,这个属性里面就是post请求参数
res.send(req.body);
});
app.listen(3000);
// http://localhost:3000/find/123
app.get('./find/:id', (req, res)=>{
console.log(req.params) // {id: 123}
})
------------------------
const express = require("express");
const bodyParse = require("body-parser");
const app = express();
app.get("/index/:id/:name/:age", (req, res) => {
// 返回路由参数
res.send(req.params);
});
app.listen(3000);
express.static
可以方便地托管静态文件,例如:img、CSS、JavaScript文件app.use(express.static('public'))
这样设置之后,public目录下的公共静态资源文件就可以被访问了
npm install art-template express-art-template
// 当渲染后缀为art的模板时,使用express-art-template
app.engine('art', require('express-art-template'))
// 设置模板存放目录
app.set('views', path.join(__dirname, 'views'))
// 渲染模板时不写后缀,默认拼接art后缀
app.set('view engine', 'art')
app.get('/', (req, res)=>{
// 渲染模板
res.render('index')
})
-------------------------------------
const express = require("express");
const path = require("path");
const app = express();
// 告诉express框架使用什么模板引擎渲染什么后缀的模板
// 模板后缀
// 使用的模板引擎
app.engine("art", require("express-art-template"));
// 告诉express框架模板存放的位置 ('views')这个参数是固定的
app.set("views", path.join(__dirname, "views"));
// 告诉express框架模板的默认后缀
app.set("view engine", "art");
app.get("/index", (req, res) => {
// res.render("index.art");
// 拼接模板路径
// 拼接模板 后缀
// 哪一个模板和哪一个数据进行拼接
// 将拼接结果响应给客户端
res.render("index", {
msg: "message",
});
});
app.listen(3000);
app.locals.users = [{
name: '张三',
age: 20
},{
name:'李四',
age: 40
}]