关于like-express.js的匹配到的routes的执行顺序

来源:10-17 -总结

77MICKY

2019-05-08

关于这个like-express.js有点疑问。

它是默认按照routes列表执行的对吧,代码中也就是use(all) 先于 method。

所以如果测试文件里面 保留了app.use(...处理404,并且没有next...),原则上会被提前到method之前执行,所以测试的时候,app.get和app.post请求反而被跳过了,并且不会被执行执行。

所以处理未命中的路由是不是还需要增加其他什么规则,而不是直接跳到根目录。

// like-express.js的测试代码 

const express = require('./like-express.js');

// 本次http请求实例
const app = express();

app.use((req, res, next) => {
    console.log('请求开始 ... ', req.method, req.url);
    next();
});

app.use((req, res, next) => {
    // 假设在处理cookie
    req.cookie = {
        userId: 'abcasdf'
    };
    console.log(req.cookie);
    next();
});

app.use((req, res, next) => {
    // 假设在处理post data
    // 异步
    setTimeout(() => {
        req.body = {
            a: 100,
            b: 200
        };
        console.log(req.body);
        next();
    });
});

app.use('/api', (req, res, next) => {
    console.log('处理 /api 路由');
    next();
});

app.get('/api', (req, res, next) => {
    console.log('get /api 路由');
    next();
});

app.post('/api', (req, res, next) => {
    console.log('post /api 路由');
    next();
});

// 模拟登录验证
function loginCheck(req, res, next) {
    console.log('模拟登录成功~!');
    // 模拟异步
    setTimeout(() => {
        next();
    });
};

app.get('/api/get-cookie', loginCheck, (req, res, next) => {
    console.log('get /api/get-cookie');
    res.json({
        errNo: 0,
        data: req.cookie
    });
});

app.post('/api/get-post-data', (req, res, next) => {
    console.log('post /api/get-post-data');
    res.json({
        errNo: 0,
        data: req.body
    });
});

app.use((req, res, next) => {
    console.log('处理 404');
    // res.json({
    //     errNo: -1,
    //     data: "404 not found"
    // });
    next();
});

app.listen(3000, () => {
    console.log('server is running on port 3000~!');
});
写回答

2回答

双越

2019-05-13

我看了好几遍,这句话是在是没看懂

//img.mukewang.com/szimg/5cd9684200018a0215280386.jpg

(另外,非常抱歉周末把这个问题给忘了,耽误了两天时间才来回复。。。)

0
1
77MICKY
哈哈 我也快忘记了,就是这个like-express里面,中间件执行顺序不是按照注册顺序来的,所以用我的代码做test的时候,会有代码被跳过的情况,不是所有的中间件都被执行了。也就是 你在注册use类型的时候,如果use是最后一种(没有任何路由的情况),您的test文件只执行了use类型的中间件,get和post类型的都没有被执行。
2019-05-14
共1条回复

双越

2019-05-08

把你测试 like-express.js 的代码贴一下吧,这么光文字描述,看着有点懵。

0
2
_奋斗的蜗牛_
遇到同样的问题,这段原理缺少了app.use和app.get/post之间执行顺序的处理
2022-05-05
共2条回复

Node.js+Express+Koa2+Nest.js 开发服务端

从入门到实战,一站式掌握 Node.js+Express+Koa2

4051 学习 · 2006 问题

查看课程