mongoose 代码操作增删改查
增加数据
position.js :
const express = require('express')
const router = express.Router()
const positionController = require('../controller/positionController')
router
.route('/position')
.post((req, res, next) => {
positionController.add({ req, res, next, ...req.body })
})
.delete((req, res, next) => {
// console.log('==================')
// console.log(req.query)
// console.log('==================')
positionController.del({ req, res, next, ...req.query })
})
.put((req, res, next) => {
positionController.update({ req, res, next, ...req.query })
})
.get((req, res, next) => {
positionController.query({ req, res, next, ...req.query })
})
module.exports = router
positionController.js :
const positionModel = require('../model/positionModel')
const positionController = {
add({ res, positionName, city, companyName }) {
positionModel.add({ res, positionName, city, companyName })
},
del({ res, positionName, city, companyName }) {
positionModel.del({ res, positionName, city, companyName })
},
update(data) {
positionModel.updated(data)
},
query({ res, positionName, city, companyName }) {
positionModel.query({ res, positionName, city, companyName })
}
}
module.exports = positionController
positionModel : 增加
async add({ res, positionName, city, companyName }) {
const result = await db.position.add({ positionName, city, companyName })
// 因为最后要存到数据库所以要传给db.position.add
// 找到db里面的index.js收数据
console.log(result) //返回底层结果 (返回index里面add的结果)
// 对返回的结果进行判断
if (result === 1) {
// 存储成功
res.render('position.ejs', {
data: JSON.stringify({
ret: true, // 这是一种认证方式
infor: '添加成功',
status: 1
})
})
} else {
// 存储失败
// 存储成功
res.render('position.ejs', {
data: JSON.stringify({
ret: true, // 这是一种认证方式
infor: '添加失败',
status: 0
})
})
}
// res.json({
// ret: true,
// status: '增加成功'
// })
},
index.js
add(data) {
return new Promise((resolve, reject) => {
const position = new position_model(data)
position.save((error) => {
// 里面成功失败返回的东西要返回到model
// 所以内部变量要返回到外层 用 promise结合async+await
// 然后return 这个promise
if (error) {
// 表示存储失败
resolve(0)
} else {
// 表示存储成功
resolve(1)
console.log('存储成功')
}
})
})
},
删除数据
positionModel.js
async del({ res, positionName, city, companyName }) {
const result = await db.position.del({ positionName, city, companyName })
switch (result) { //result的结果是0 1 2
case 0:
res.render('position', {
data: JSON.stringify({
ret: true,
infor: '数据库没有这条数据',
status: 0
})
})
break;
case 1:
res.render('position', {
data: JSON.stringify({
ret: true,
infor: '删除成功',
status: 1
})
})
break;
case 2:
res.render('position', {
data: JSON.stringify({
ret: true,
infor: '已经删除了该数据',
status: 2
})
})
break;
}
},
index.js
del(data) {
return new Promise((resolve, reject) => {
position_model.find(data, (error, docs) => {
if (!(docs.length === 0)) {
position_model.findById(docs[0]._id, (error, result) => {
if (result) {
// 可以删除
resolve(1)
result.remove()
} else {
//没必要删除 已经删除了此时在重复操作
resolve(2)
}
})
} else {
// 没有找到这条数据
resolve(0)
} //判断完成后再model里面进行判断
})
})
},
查询数据
async query({ res, positionName, city, companyName }) {
const result = await db.position.query({ positionName, city, companyName })
res.render('position', {
data: JSON.stringify({
ret: true,
infor: '查询成功',
data: result
})
})
},
}
index.js
query(data) {
return new Promise((resolve, reject) => {
if (data) {
// 精确查找某一条
position_model.find(data, (error, docs) => {
resolve(docs) // 此时的docs是找到的结果
}) //精确查找某一条数据
} else {
// 查找所有的数据
position_model.find({}, (error, docs) => {
resolve(docs)
}) //查找所有的数据
}
})
},
修改数据
async updated({ res, positionName, city, companyName }) {
const result = await db.position.update({ positionName, city, companyName })
if (result === 0) {
res.render('position', {
data: JSON.stringify({
ret: true,
infor: '修改失败',
status: 0
})
})
} else {
res.render('position', {
data: JSON.stringify({
ret: true,
infor: '修改成功',
status: 1
})
})
}
},
update(data) {
// console.log('=============')
// console.log(data)
// console.log('===================')
return new Promise((resolve, reject) => {
position_model.find(data, (error, docs) => {
if (!(docs.length === 0)) {
// // 数据库有该数据
position_model.findById(docs[0]._id, (error, result) => {
// console.log('=============')
// console.log(result)
// console.log('===================')
result.city = '宁波'
// result.city = data.city
result.save(error => {
if (error) {
// 修改失败
resolve(0)
} else {
// 修改成功
resolve(1)
}
})
})
} else {
}
})
})
},
SSR 与 SEO
JWT
- 用户登录 服务器端产生一个token (加密字符串) 发送给前端
- 前端将token 进行保存
- 前端发起数据请求的时候携带token
- 服务端 验证token 是否合法 如果合法继续操作 不合法终止操作
- token 的使用场景 无状态请求 保持用户的登录状态 第三方登录(token+auth2.0)
实现自动登录
1.创建路由:
const express = require('express')
const router = express.Router()
const fs = require('fs')
const path = require('path')
const jwt = require('jsonwebtoken')
router
.route('/login')
.post((req, res, next) => {
res.setHeader('Access-Control-Allow-Origin', '*')//请求头设置解决跨域问题
// console.log(req.body)
const { token, username, password } = req.body
if (token) {
// 证明有值可以自动登录
res.render('login', { //此时的login路径是ejs的路径//前端可见的返回值
data: JSON.stringify({
infor: '登录成功',
status: 1
})
})
} else {
// 第一次登录
// 重新生成token返回给前端
// 1.通过文件系统读取私钥 需要引入fs
let private_key = fs.readFileSync(path.join(__dirname, '../private_key.pem'))
// let public_key = fs.readFileSync(path.join(__dirname, './public_key.pem'))
var use_token = jwt.sign(username, private_key, { algorithm: 'RS256' });
// payload 负载 数据 这里指用户名
// private_key 私钥
res.render('login', { //登录成功后 前端需要把账号密码存下来,方便下次打开页面直接登录
data: JSON.stringify({
infor: '登录成功',
status: 1,
token: use_token
})
})
}
2.创建前端显示页面html
3.解决跨域问题
4.产生私钥
let private_key = fs.readFileSync(path.join(__dirname, '../private_key.pem'))
// let public_key = fs.readFileSync(path.join(__dirname, './public_key.pem'))
var use_token = jwt.sign(username, private_key, { algorithm: 'RS256' });
5.读取生成的私钥 返回给前端
res.render('login', { //登录成功后 前端需要把账号密码存下来,方便下次打开页面直接登录
data: JSON.stringify({
infor: '登录成功',
status: 1,
token: use_token //返回给前端的私钥
})
})
6.前端接收返回的值,存下来。
非对称加密 通过私钥产生token 通过公钥解密token
产生私钥和公钥的终端命令
// 产生私钥 openssl genrsa -out ./private_key.pem 1024 1024 代表私钥长度
产生公钥:
// 产生公钥 openssl rsa -in ./private_key.pem -pubout -out ./public_key.pem
// 1.产生公钥和私钥
// 产生私钥 openssl genrsa -out ./private_key.pem 1024 1024 代表私钥长度
// 产生公钥 openssl rsa -in ./private_key.pem -pubout -out ./public_key.pem
let private_key=fs.readFileSync(path.join(__dirname,'./private_key.pem'))
let public_key=fs.readFileSync(path.join(__dirname,'./public_key.pem'))
var token = jwt.sign(palyload, private_key,{ algorithm: 'RS256'});
console.log(token)
let token='eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IueUqOaIt2lkIiwiaWF0IjoxNTUxMTUyNzk1fQ.TI_xDBvObHGAH7EV40WWpQemm5nx077Gdjq-pzDx0NWN5YFd40S7XcLmgoDdYscLM7vMOP0c7z1l83JUixqk7IBjBCU-tMNo_G5_-LGkQjV3vDYq_3TkXTl42lgmFA-EBey7W6W1PgPfYlowyHAyp-07hXaMRevgVkXm2lPEFXo'
var decoded = jwt.verify(token, public_key);
自动化测试工具
1.mocha
1. 安装配置
$ npm install --global mocha
2.安装项目依赖 (局部安装)
$ npm isntall mocha
基本语法:
assert 断言
- 断言库:chai
- should 风格断言
- expect 风格断言、
全局安装chai
npm install chai -g
2.jest