Express 4中的app.VERB/app.route/app.use/router.VERB/router.route/router.use

好久不碰Express,发现这些东西又忘了,查完资料趁热记录一下。

先提一下Express的路由机制:

Express 2.x/3.x时代,app.VERB(即app.all/app.get/app.post/app.put等)是隶属于app.router这个middleware的,并且app.router需要你手动通过app.use(app.router)来挂载到middleware stack中。由于各app.use(someMiddleware)调用的先后顺序,决定了各middleware被执行的先后,因此app.VERB跟其他middleware的先后执行顺序就显得比较微妙。比如说你写了一坨app.VERB,本来运行得好好的,不小心把app.use(app.router)挪了下位置,路由链就整个全乱套了,通俗点说就是:被坑了。

上述机制在Express 4.x中被彻底推翻,app.router不再需要(不应该)被手动挂载,app.VERB被提升到跟其他middleware同等的地位,哪一个先调用,哪一个就先被执行(当然前提是path得要match)。这个改动意义很大,简化规则后,妈妈再也不用担心我的路由链乱糟糟的了。

现在回到各种眼花缭乱的常用API:

  • app.VERB()
    VERB指的是各种HTTP METHOD,比如GET/POST/DELETE等。routeFunc的参数列表为req, res, next。其中next是下一个路由函数。是否需要调用next()取决于你的业务逻辑,如果不调用next(),则路由链上的后续路由函数都不会被执行。
app.VERB('/path1', routeFunc);    //仅匹配/path1,/path1/path2不会被匹配
app.VERB('/path1', routeFunc1, routeFunc2);    //支持多路由函数链,routeFunc2能被执行到的前提是,routeFunc1中调用了next()
  • app.route()
    对于同一个path,如果想对其GET/POST/DELETE……各自定制处理函数,该怎么写?可以app.get/app.post/app.delete各写一遍,或者用更加优雅的方式:
app.route('/path1')
    .get(function(req, res) {
        //blah blah
    })
    .post(function(req, res) {
        //blah blah
    })
    .all(function(req, res) {
        //因为楼上的get/post都没有调用next(),
        //所以到达这里的,都是其他METHOD的情况
        res.sendStatus(501);    //not implemented
    });
  • app.use()
    app可以挂载某个router,也可以直接挂载某个routeFunc。
    关于router对象的更多介绍,下文会详述。
app.use(someRouter);    //未提供path,则path等同于/,所有req都会走这个someRouter,当然,前提是前面的路由函数调用了next()
app.use('/path1', someRouter);    // /path1和/path1/path2都会走someRouter。对someRouter的子路由函数而言,req.path是/path1后面的部分。
app.use('/path1', someRouter1, someRouter2);    //跟app.VERB类似,可以直接提供多个路由,也可以分开写,即等价于以下写法:
app.use('/path1', someRouter1); 
app.use('/path1', someRouter2); 
  • router对象
    router对象可以通过 var router = express.Router();来创建。
    app对象其实可以看做一个特殊的router对象,正如app一样,router也有VERB()/route()/use()函数,用法也完全一样。

  • app/router 各API的path参数
    path参数都支持通配符和正则式,具体直接看官方文档。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据