Nodejs ·

express框架中app.use和app.all的区别

在使用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

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.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();
})

参与评论