npx express-generator
老版本运行如下代码:
npm install -g express-generator
express
终端切换到创建文件夹的目录
express --view-ejs express10
创建了文件 express10
Express 结合 multer 上传图片
npm install --save multer
const multer = require('multer') //上传图片文件
封装一个函数
const path = require('path') const sd = require('silly-datetime') const mkdirp = require('mkdirp') const multer = require('multer') //上传图片文件 const { mkdir } = require('fs') let tools = { multer() { const storage = multer.diskStorage({ destination: async (req, file, cb) => { //获取当前日期 const day = sd.format(new Date(), 'YYYY-MM-DD'); //按照日期生成图片存储目录 let dir = path.join(__dirname, '../public/upload', day) await mkdirp(dir) //mkdirp 是异步方法 cb(null, dir) //上传之前目录必须存在 }, // 修改上传后的文件名 filename: function (req, file, cb) { //1. 获取后缀名 let extname = path.extname(file.originalname) //2. 根据时间生成后缀名 const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9) cb(null, file.fieldname + '-' + uniqueSuffix + extname) } }) const upload = multer({ storage: storage }) return upload }, md5() { } } module.exports = tools
// 调用时: let cpUpload = tools.multer().fields([{ name: 'pic1', maxCount: 1 }, { name: 'pic2', maxCount: 8 }]) router.post('/doLogin',cpUpload, (req, res) => { res.send({ body: req.body, file: req.files }) })
EJS
语法
app.get("/article", (req, res) => { const userinfo = { username: '张三', age: 20 } const article = "<h2>解析并输出js标签<h2>" const list = [111,222,333,444,] res.render("news", { userinfo: userinfo, article: article, flag:true, score:70, list:list }) })
<h1>我是一个EJS模板引擎----新闻页面</h1> <p><%=userinfo.username%>------<%=userinfo.age%></p> <p><%-article%></p> <h1>条件判断</h1> <%if(flag == true) {%> <strong>flag=true</strong> <%}%> <%if(score >= 60){%> <p>及格</p> <%}else{%> <p>不及格</p> <%}%> <h1>循环遍历</h1> <%for(let i =0; i<list.length; i++){%> <li><%=list[i]%></li> <%}%> <%- include('footer.html') %>
修改模板文件的后缀名为 .html
const ejs = require('ejs') // 注册html模板引擎 app.engine("html", ejs.__express) //静态文件托管 app.set("view engine", "html")
ctrl + w + f
配置静态web目录
app.use(express.static("static")) //app.use('/static', express.static('public')) 指定了一个挂载方式
中间件
next函数的作用
next 函数是实现多个中间件连续调用的关键, 他表示把流转关系转交给下一个中间件或路由.
全局生效的中间件
客户端发起的任何请求, 到达服务端后,都会触发的中间件,叫做全局生效的中间件
应用级中间件
用于权限判断
app.use((req, res, next) => { console.log(new Date); next() })
错误处理中间件
app.use((req, res, next) => { res.status(404).send("404") next() })
内置中间件
//配置静态web目录 内置中间件 app.use(express.static("static"))
第三方中间件
//配置第三方中间件,解析body app.use(bodyParser.urlencoded({ extended: false })) app.use(bodyParser.json())
cookie
npm i cookie-parser
// 1.引入 const cookieParser = require('cookie-parser') // 2.配置 app.use(cookieParser("jhuk")) //3.设置cookie app.get("/", (req,res) => { // 设置cookie // 如果cookie没有过期的,关闭浏览器重新打开,cookie不会销毁 res.cookie("username", "zhangsan", {maxAge: 1000*60*60, signed:true}) res.send("你好 express") }) //4.获取cookie app.get("/news", (req, res) => { //post: 增加数据 // 获取cookie let username = req.cookies.username console.log(username); res.send('注册页面--- ' + username) })
cookie参数
cookie(name:string, val: string, option: CookieOptions): this;
option参数
maxAge?: number | undefined; //过期时间(毫秒数) signed?: boolean | undefined; //是否加密 expires?: Date | undefined; //也是加密(用的较少) httpOnly?: boolean | undefined; //默认为false,为true时只能在后台访问cookie,不能在javascript中访问 path?: string | undefined; //设置cookie访问的目录 //res.cookie("username", "zhangsan", {maxAge: 1000*60*60,path:"/news",}) domain?: string | undefined; //多域共享一cookie //多个域名共享cookie, aaa.itying.com bbb.itying.com 配置:domain:".itying.com"
加密cookie
//1.配置中间件,传入加密的参数 app.use(cookieParser("jhuk")) //参数随便写 //2.设置加密 res.cookie("username", "zhangsan", {maxAge: 1000*60*60,signed:true}) //3.获取加密 req.signedCookies 获取加密cookie
Session
session 是另一种记录客户状态的机制, 不同的是Cookie保存在客户端浏览器中,而session保存在服务器端
session相比cookie更安全一点,由于session保存在服务器上,所以当访问量增多的时候,会比较占用服务器的性能.单个Cookie保存的数据大小不能超过4k,很多浏览器都限制一个站点最多保存20个cookie,Session没有这方面的限制.Session是基于Cookie 进行工作的.
npm i express-session
// 引入 const session = require('express-session') app.set('trust proxy', 1) // trust first proxy // 配置session中间件 app.use(session({ secret: 'keyboard cat', ///服务端生成session的签名 resave: false, //默认设置 强制保存 session 即使它并没有变化 saveUninitialized: true, //默认设置 强制将未初始化的 session 存储 name: "itying", //sessin对应cookie的名称 roolling: true, //在每次请求时,强行设置cookie,这将重置 cookie 过期时间(默认: false) cookie: { maxAge:1000*60, secure: false //true 表示只有https协议才能访问cookie ... } })) //设置session req.session.username = "张三" //获取session req.session.username if(req.session.username) { res.send(req.session.username+"-已登录") }else{ res.send('没有登录') } //销毁session req.session.destroy({}) //重新设置cookie的过期时间 req.session.cookie.maxAge=0
负载均衡配置Session, 把Session保存在数据库里面
npm i connect-mongo --save
const session = require('express-session') const MongoStore = require('connect-mongo')(session) app.use(session({ secret: 'keyboard cat', ///服务端生成session的签名 resave: false, //默认设置 强制保存 session 即使它并没有变化 saveUninitialized: true, //默认设置 强制将未初始化的 session 存储 name: "itying", //sessin对应cookie的名称 roolling: true, //在每次请求时,强行设置cookie,这将重置 cookie 过期时间(默认: false) cookie: { maxAge:1000*60, secure: false //true 表示只有https协议才能访问cookie } , //=======重点看这里!!!-================= store: MongoStore.create({ url:'mongodb:127.0.0.1:27017/menu', touchAfter: 24 * 3600, //不管发出多少请求, 在24小时内只更新一次session, 除非你改变了 session }) }))