事件moment模块
const moment = require('moment');
const time = moment().format('YYYY年MM月DD日 HH:mm:ss');
console.log(time);
跨域cors模块
const e = require('cors');
app.use(cors());//跨域中间件
数据库mysql模块
const e = require('cors');
const mysql = require('mysql');
const db = mysql.createPool({
host: '127.0.0.1',
user:'root',
password: '123456',
database: 'db_exp'
})
//检测数据库模块是否能工作 select 1没有任何作用,只是测试
// db.query('select 1',(err,results)=>{
// if(err){
// console.log(err.message);
// return
// }
// console.log(results);
// })
// 查询数据
// const sqlStr = 'select * from user'
// db.query(sqlStr,(err,relust)=>{
// if(err){
// console.log(err.message);
// return
// }
// console.log(relust);
// })
//插入数据
// const user = {username:'周丫丫',password:'213'}
// const sqlInsert = 'insert into user (username,password) values (?,?)'
// db.query(sqlInsert,[user.username,user.password],(err,result)=>{
// if (err) {
// console.log(err.message);
// return
// }
// if (result.affectedRows === 1) {
// console.log('插入数据成功');
// }
// })
//插入数据快捷方式
// const users = {username:'周天才',password:'716'}
// const sqlInserts = 'insert into user set ?'
// db.query(sqlInserts,users,(err,result)=>{
// if (err) {
// console.log(err.message);
// return
// }
// if (result.affectedRows === 1) {
// console.log('插入数据成功');
// }
// })
//更新数据
// const user = {id:6,username:'哈哈哈',password:'000'}
// const updataStr = 'update user set username=?,password=? where id=?'
// db.query(updataStr,[user.username,user.password,user.id],(err,result)=>{
// if (err) {
// console.log(err.message);
// return
// }
// if(result.affectedRows === 1){
// console.log('更新成功');
// }
// })
//快速更新数据
// const users = {id:7,username:'哈哈哈',password:'000'}
// const updataStrs = 'update user set? where id=?'
// db.query(updataStrs,[users,users.id],(err,result)=>{
// if (err) {
// console.log(err.message);
// return
// }
// if(result.affectedRows === 1){
// console.log('更新成功');
// }
// })
//删除数据
// const sqlDelete = 'delete from user where id=?'
// db.query(sqlDelete,2,(err,result)=>{
// if (err) {
// console.log(err.message);
// return
// }
// if(result.affectedRows === 1){
// console.log('删除成功');
// }
// })
//标记删除 模拟删除 status是表里面的一个表示状态的数据 0表示删除 假装删除
const sqlDeletes = 'update user set status=? where id =?'
db.query(sqlDeletes,[1,7],(err,result)=>{
if(err){
console.log(err.message);
return
}
if(result.affectedRows===1){
console.log('标记删除成功');
}
})
//es7封装数据库
const mysql = require('mysql');
const db = mysql.createConnection({
host:'127.0.0.1',
port:'3306',
user:'root',
password:'123456',
database:'db11'
})
db.connect()
function ALL(sql){
return new Promise((resolve,reject)=>{
db.query(sql,(err,data)=>{
if(err) throw reject(err)
resolve(data)
})
})
}
module.exports=ALL
//调用封装数据库函数
const express = require('express');
const all = require('./11.封装数据库函数');
const app = express();
app.use(express.json())
// app.use(express.urlencoded())
//查询所有
app.get('/users', async (req, res) => {
let sql = 'select * from student'
const data = await all(sql)
res.send(data)
})
//查询一个
app.get('/users/:id', async (req, res) => {
const id = req.params.id
let sql = `select * from student where id = ${id}`
const data = await all(sql)
res.send(data)
})
//新增
app.post('/users', async (req, res) => {
const { name, age } = req.body
let sql = `insert into student values (null,'${name}','${age}')`
const data = await all(sql)
res.send(data)
})
//修改
app.put('/users/:id', async (req, res) => {
const id = req.params.id
const { name, age } = req.body
let sql = `update student set name ='${name}',age ='${age}' where id ='${id}'`
const data = await all(sql)
res.send(data)
})
//删除
app.delete('/users/:id', async (req, res) => {
const id = req.params.id
let sql = `delete from student where id ='${id}'`
const data = await all(sql)
res.send(data)
})
app.listen(8080, function () {
console.log('http://127.0.0.1:8080/');
})
json数据服务器json-server
##查询全部
GET http://localhost:3000/users HTTP/1.1
###查询单个
GET http://localhost:3000/users?name=hmj HTTP/1.1
###查询多个
GET http://localhost:3000/users?id=3&id=2 HTTP/1.1
###新增
POST http://localhost:3000/users HTTP/1.1
Content-Type: application/x-www-form-urlencoded
id=4&name=zyy&age=24
###新增使用json
POST http://localhost:3000/users HTTP/1.1
Content-Type: application/json
{
"id":6,
"name":"zyy",
"age":"24"
}
###修改
PUT http://localhost:3000/users/3 HTTP/1.1
Content-Type: application/x-www-form-urlencoded
id=4&name=hmj&age=21
###使用json修改
PUT http://localhost:3000/users/4 HTTP/1.1
Content-Type: application/json
{"name":"hjm","age":"22"}
###删除
DELETE http://localhost:3000/users/2 HTTP/1.1
app.use(express.static(path.join(__dirname)))
session中间件使用cookie字符串登录
const express = require('express');
const session = require('express-session');
const app = express()
app.use(express.urlencoded({extended:false}))
app.use(session({
secret:'sjsj',
saveUninitialized:true,
resave:false,
}))
app.post('/login',(req,res)=>{
if(username!=admin||psaaword!='123'){
return res.send({status:1,meg:"登录失败"})
}
req.session.user=req.body
req.session.isLogin=true
res.send({status:0,meg:'登录成功'})
})
app.get('/username',(req,res)=>{
if(!req.session.isLogin){
return res.send({status:1,meg:'false'})
}
res.send({status:0,meg:'success',username:req.session.user.username})
})
app.post('/layout',(req,res)=>{
req.session.destroy()
res.send({status:0,msg:'退出登录成功'})
})
app.listen(8080,function(){
console.log("server running");
})
express脚手架
npm i express-generator -g //全局安装
express --no-view backEnd //-在目录下创建一个`backEnd`的目录, 作为后端项目的目录,--no-view`: 创建一个数据服务, 不提供页面服务
npm install //进入`backEnd`目录, 执行命令, 根据`package.jsoon`中的依赖项, 安装项目所有的依赖
npm i nodemon -D //使用`nodemon`启动项目,将`nodemon`作为开发时依赖安装
"scripts": {
"start": "nodemon ./bin/www"
}, //修改`pagckage.json`中的脚本
npm run start //执行
bcryptjs模块对密码进行加密处理。 安装npm i bcryptjs@2.4.3
const bcrypt = require('bcryptjs')
const userinfo = req.body //获得请求体的用户名和密码
userinfo.password = bcrypt.hashSync(userinfo.password, 10) //对密码进行加密处理bcrypt.hashSync(明文密码, 随机盐的长度)
Joi 安装npm install joi 进行表单数据验证(前端验证为辅,后端验证为主)
用@escook/express-joi 中间件 来实现自动对表单数据进行验证的功能。安装npm i @escook/express-joi
const joi = require('joi')
/**
* string() 值必须是字符串
* alphanum() 值只能是包含 a-zA-Z0-9 的字符串
* min(length) 最小长度
* max(length) 最大长度
* required() 值是必填项,不能为 undefined
* pattern(正则表达式) 值必须符合正则表达式的规则
*/
// 用户名的验证规则
const username = joi.string().alphanum().min(1).max(10).required()
// 密码的验证规则
const password = joi
.string()
.pattern(/^[\S]{6,12}$/)
.required()
// 注册和登录表单的验证规则对象
exports.reg_login_schema = {
// 表示需要对 req.body 中的数据进行验证
body: {
username,
password,
},
}
**//路由中引用进行验证**
const express = require('express')
const router = express.Router()
// 导入用户路由处理函数模块
const userHandler = require('../router_handler/user')
// 1. 导入验证表单数据的中间件
const expressJoi = require('@escook/express-joi')
// 2. 导入需要的验证规则对象
const { reg_login_schema } = require('../schema/user')
// 注册新用户
// 3. 在注册新用户的路由中,声明局部中间件,对当前请求中携带的数据进行验证
// 3.1 数据验证通过后,会把这次请求流转给后面的路由处理函数
// 3.2 数据验证失败后,终止后续代码的执行,并抛出一个全局的 Error 错误,进入全局错误级别中间件中进行处理
router.post('/reguser', expressJoi(reg_login_schema), userHandler.regUser)
module.exports = router
**全局错误级别中间件中,捕获验证失败的错误,并把验证失败的结果响应给客户端**
const joi = require('joi')
// 错误中间件
app.use(function (err, req, res, next) {
// 数据验证失败
if (err instanceof joi.ValidationError) return res.cc(err)
// 未知错误
res.cc(err)
})