在使用express框架时,在app.js中经常会发现app.use和app.all的身影,下面我们来看一下这两者期间有什么共同点和不同点。
先来看一段代码示例:
const express = require('express');
const app = express();
app.use('/a',function(req,res,next){
console.log('111');
next();
});
app.all('/a',function(req,res,next){
console.log('222');
res.end("执行完毕")
});
当我们请求/a路由时,会依次输出111和222,然后浏览器端显示执行完毕。
app.use一般情况下主要应用于中间件,use('/a') 只用路径以 /a 开始即可匹配,如果有路径 /a/b 、 /a/b/c ,都会经过该函数处理,也就是说都会输出111,相当于自带匹配效果
app.use前面的路径是可以省略的,如果省略的话则代表匹配所有路径,所以一般应用于中间件的处理,比如说网站启用GZip压缩:
const compression = require('compression');
app.use(compression());
如果我们想对以某个字符串开头的路径做处理,我们可以按下面的方式写,以session为例:
const session = require("express-session")
app.use("/hehe",session({
name: 'sessionID',//存储在用户cookie中的key名
secret: 'secret', // 用来对session id相关的cookie进行签名
//store: new FileStore(), // 本地存储session(文本文件,也可以选择其他store,比如redis的)
saveUninitialized: false, // 是否自动保存未初始化的会话,建议false
resave: false, // 是否每次都重新保存会话,建议false
cookie: {
maxAge: 20*60 * 1000 // 有效期,单位是毫秒
}
}))
app.all其实是和app.get和app.post类似,它是app.get和app.post等的一个统一函数,可以接收任何的请求,路径匹配的是完整路径,如果要匹配以某个字符串开头,则后面添加* 即可,所以app.all('* ',(req,res,next)=>{})和app.use((req,res,next)=>{})效果是相同的。但是在一般情况下,为了好识别和解读程序代码,最好还是让其按语义来执行。app.all的一个用途是可以处理跨域请求:
app.all('/*',(req,res,next)=>{
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Methods","*");
res.header("X-Powered-By",' 3.2.1');
res.header("Content-Type", "application/json;charset=utf-8");
next();
})