文章目录

前情概要

在使用express框架开发的时候,每加一个请求,都在增加一条route请求规则,类似于下面的代码,很烦有木有!

app.use('/myroute path', (req, res, next) => { //dosomething })

我们难道不能再智能一点点么,学习后端mvc框架一样,比如加个标记,或者默认规则直接自动映射嘛。约定胜于配置嘛!

我们的实现思路

  1. 拦截所有请求
  2. 根据我们的规则进行路由的匹配
  3. 调用匹配到的处理函数

拦截所有请求

这个太好办了,app.use('/') 搞定。参考下面的代码

import * as express from 'express'
import * as controllers from './controller'
import { RequestHandler, RouteHandler } from 'gd-express-basic' const _app = express();
//第一个express 中间件,处理一下跨域请求中的options请求。
_app.use((req, res, next) => {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Headers', 'Content-Type,Content-Length,Authorization,Accept,X-Requested-With');
res.header('Access-Control-Allow-Methods', 'PUT,POST,GET,DELETE,OPTIONS');
if (req.method == 'OPTIONS') {
res.send(new ResponseBase(200));
}
next && next();
});
//第二个中间件,拦截所有请求对路由做自动映射
RouteHandler(_app, controllers);
//第三个中间件,处理请求
_app.use(RequestHandler);
//第N个中间件,处理一下error呀,404呀等其他情况。

根据规则进行路由的匹配

接下来看一看RouteHandler方法。主要干几个事情

  1. 缓存所有action,方便后续的调用。【 请求处理函数的特性注册篇【详细说明】
  2. 拦截所有请求,并根据规则解析到对应的action上面去。【app.use('/', (req, res, next)】
  3. 根据解析出来的controller 、action名称以及当前请求的method找到对应的action并记录到当前请求对象上,方便接下来的请求处理。

    目前我们的规则很简单。url分2层,第一层为controller名称,第二层为action名称。即:/{controller}/{action};
/**
* 路由选择处理中间件
*
* @export
* @param {core.Express} app
* @param {*} controllers
*/
export function RouteHandler(app: core.Express, controllers: any) {
//程序启动的时候,找到当前所有的controllers,并根据规则缓存好我们所有的处理函数(action),方便接下来的匹配
//请求处理函数发现篇【controller+action】具体讲到
find(controllers)
//拦截所有请求,对请求
app.use('/', (req, res, next) => {
//拿到route并解析出来controller和action的名称。
var pathArr = getRouteTokens(req.path)
var controller = (pathArr[0] && pathArr[0].toLowerCase()) || 'home';
var action = (pathArr[1] && pathArr[1].toLowerCase()) || 'index'
//根据参数找到能处理这个请求的action
var desc = GetActionDescriptor(controller, action, req.method)
if (!desc) {
desc = GetActionDescriptor(controller, '_default', req.method)
}
if (desc && (!desc.HttpMethod || (desc.HttpMethod && desc.HttpMethod === req.method))) { res.locals.authInfo = { isAuth: desc.isAuth };
//如果请求能匹配到可以处理的action,则赋值
res.locals.actionDescriptor = desc;
}else{//否则跳过。当然在这里也可以直接返回404,结束本次请求。
}
next && next()
})
} function getRouteTokens(path: string) {
var pathArr = path.split('/');
var arr: string[] = [];
pathArr.forEach(element => {
if (element) arr.push(element)
});
return arr
}

代码那是相当的简单。其实只干了一件事情,据我们的url规则找到与之匹配的在项目启动的时候扫描缓存的请求处理函数

  1. 考虑到前端不太会有area的概念,所以暂时没有支持,如果要支持其实也很简单,增加一个area注册,然后再做路由匹配的时候多判断一次area就完事儿了。
  2. 估计也不太会有自定义route 的要求,比如dotnet mvc 里面的【[Route("/path")]】特性。所以也暂未做支持。如果确实有也可以通过app.use实现。

【nodejs】让nodejs像后端mvc框架(asp.net mvc )一样处理请求--自动路由篇(1/8)【route】的更多相关文章

  1. 七天学会ASP.NET MVC (三)——ASP.Net MVC 数据处理

    第三天我们将学习Asp.Net中数据处理功能,了解数据访问层,EF,以及EF中常用的代码实现方式,创建数据访问层和数据入口,处理Post数据,以及数据验证等功能. 系列文章 七天学会ASP.NET M ...

  2. 七天学会ASP.NET MVC (三)——ASP.Net MVC 数据处理 【转】

    http://www.cnblogs.com/powertoolsteam/p/MVC_three.html 第三天我们将学习Asp.Net中数据处理功能,了解数据访问层,EF,以及EF中常用的代码实 ...

  3. 七天学会ASP.NET MVC (二)——ASP.NET MVC 数据传递

    通过第一天的学习之后,我们相信您已经对MVC有一些基本了解. 本节所讲的内容是在上节的基础之上,因此需要确保您是否掌握了上一节的内容.本章的目标是在今天学习结束时利用最佳实践解决方案创建一个小型的MV ...

  4. 【MVC】ASP.NET MVC Forms验证机制

    http://www.cnblogs.com/bomo/p/3309766.html 随笔 - 121  文章 - 0  评论 - 92 [MVC]ASP.NET MVC Forms验证机制 ASP. ...

  5. 返璞归真 asp.net mvc (13) - asp.net mvc 5.0 新特性

    [索引页][源码下载] 返璞归真 asp.net mvc (13) - asp.net mvc 5.0 新特性 作者:webabcd 介绍asp.net mvc 之 asp.net mvc 5.0 新 ...

  6. asp.net mvc ,asp.net mvc api 中使用全局过滤器进行异常捕获记录

    MVC下的全局异常过滤器注册方式如下:标红为asp.net mvc ,asp.net mvc api  注册全局异常过滤器的不同之处 using SuperManCore; using System. ...

  7. 返璞归真 asp.net mvc (7) - asp.net mvc 3.0 新特性之 Controller

    原文:返璞归真 asp.net mvc (7) - asp.net mvc 3.0 新特性之 Controller [索引页][源码下载] 返璞归真 asp.net mvc (7) - asp.net ...

  8. 返璞归真 asp.net mvc (8) - asp.net mvc 3.0 新特性之 Model

    原文:返璞归真 asp.net mvc (8) - asp.net mvc 3.0 新特性之 Model [索引页][源码下载] 返璞归真 asp.net mvc (8) - asp.net mvc ...

  9. 返璞归真 asp.net mvc (12) - asp.net mvc 4.0 新特性之移动特性

    原文:返璞归真 asp.net mvc (12) - asp.net mvc 4.0 新特性之移动特性 [索引页][源码下载] 返璞归真 asp.net mvc (12) - asp.net mvc ...

随机推荐

  1. [20180718]拷贝数据文件从dg库.txt

    [20180718]拷贝数据文件从dg库.txt 1.测试环境:SCOTT@book> @ ver1PORT_STRING                    VERSION        B ...

  2. [20180614]删除bootstrap$记录无法启动2.txt

    [20180614]删除bootstrap$记录无法启动2.txt --//前几天看链接http://www.xifenfei.com/2018/05/willfully-delete-bootstr ...

  3. Opengl正交矩阵 glOrthof 数学原理(转)

    http://blog.sina.com.cn/s/blog_6084f588010192ug.html 在opengles1.1中设置正交矩阵只要一个函数调用就可以了:glOrthof,但是open ...

  4. python学习--Django虚拟环境搭建

    一 . 为什么选择搭建虚拟环境 搭建一个只对本次项目有用的虚拟环境,而不影响主环境 二 . 安装前准备 #    1. 安装 python #    2. 安装virtualenvwrapper #  ...

  5. PHP APP端微信支付

    前面已经写了手机APP支付宝支付,今天再把手机APP微信支付补上,前期的准备工作在这里就不多说了,可以参考微信支付开发文档,一定要仔细阅读开发文档,可以让你少踩点坑:准备工作完成后就是配置参数,调用统 ...

  6. 第 16 章 C 预处理器和 C 库(条件编译)

    /*-------------------------------------- names_st.h -- names_st 结构的头文件 ----------------------------- ...

  7. IntelliJ IDEA src下新建包, 没有层级结构

    新建项目后再src先右键点击新建包  com.example  , 然后想在com.example 包中包含其他包, 当点击src新建包后,出现如图的情况 解决: 继续在src上右键新建package ...

  8. 使用vue的v-for生成table , 给table加上序号

    现在有一个使用mybatis的分页插件生成的table,table中数据是通过vue获得的 , 前台显示使用<tr v-for="item in items"> 后台v ...

  9. MATLAB常微分方程的数值解法

    MATLAB常微分方程的数值解法 作者:凯鲁嘎吉 - 博客园http://www.cnblogs.com/kailugaji/ 一.实验目的 科学技术中常常要求解常微分方程的定解问题,所谓数值解法就是 ...

  10. 控件_RadioGroup&&RadioButton(单选按钮)和Toast

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools=&q ...