【nodejs】让nodejs像后端mvc框架(asp.net mvc )一样处理请求--自动路由篇(1/8)【route】
文章目录
前情概要
在使用express框架开发的时候,每加一个请求,都在增加一条route请求规则,类似于下面的代码,很烦有木有!
app.use('/myroute path', (req, res, next) => { //dosomething })
我们难道不能再智能一点点么,学习后端mvc框架一样,比如加个标记,或者默认规则直接自动映射嘛。约定胜于配置嘛!
我们的实现思路
- 拦截所有请求
- 根据我们的规则进行路由的匹配
- 调用匹配到的处理函数
拦截所有请求
这个太好办了,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方法。主要干几个事情
- 缓存所有action,方便后续的调用。【 请求处理函数的特性注册篇【详细说明】
- 拦截所有请求,并根据规则解析到对应的action上面去。【app.use('/', (req, res, next)】
- 根据解析出来的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规则找到与之匹配的在项目启动的时候扫描缓存的请求处理函数
- 考虑到前端不太会有area的概念,所以暂时没有支持,如果要支持其实也很简单,增加一个area注册,然后再做路由匹配的时候多判断一次area就完事儿了。
- 估计也不太会有自定义route 的要求,比如dotnet mvc 里面的【[Route("/path")]】特性。所以也暂未做支持。如果确实有也可以通过app.use实现。
【nodejs】让nodejs像后端mvc框架(asp.net mvc )一样处理请求--自动路由篇(1/8)【route】的更多相关文章
- 七天学会ASP.NET MVC (三)——ASP.Net MVC 数据处理
第三天我们将学习Asp.Net中数据处理功能,了解数据访问层,EF,以及EF中常用的代码实现方式,创建数据访问层和数据入口,处理Post数据,以及数据验证等功能. 系列文章 七天学会ASP.NET M ...
- 七天学会ASP.NET MVC (三)——ASP.Net MVC 数据处理 【转】
http://www.cnblogs.com/powertoolsteam/p/MVC_three.html 第三天我们将学习Asp.Net中数据处理功能,了解数据访问层,EF,以及EF中常用的代码实 ...
- 七天学会ASP.NET MVC (二)——ASP.NET MVC 数据传递
通过第一天的学习之后,我们相信您已经对MVC有一些基本了解. 本节所讲的内容是在上节的基础之上,因此需要确保您是否掌握了上一节的内容.本章的目标是在今天学习结束时利用最佳实践解决方案创建一个小型的MV ...
- 【MVC】ASP.NET MVC Forms验证机制
http://www.cnblogs.com/bomo/p/3309766.html 随笔 - 121 文章 - 0 评论 - 92 [MVC]ASP.NET MVC Forms验证机制 ASP. ...
- 返璞归真 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 新 ...
- asp.net mvc ,asp.net mvc api 中使用全局过滤器进行异常捕获记录
MVC下的全局异常过滤器注册方式如下:标红为asp.net mvc ,asp.net mvc api 注册全局异常过滤器的不同之处 using SuperManCore; using System. ...
- 返璞归真 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 ...
- 返璞归真 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 ...
- 返璞归真 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 ...
随机推荐
- C#语言————第四章 常用Convert类的类型转换方法
方法 说明Convert.ToInt32() 转换为整型(int 型)Convert.ToStringle() 转换为单精度浮点型(float 型)Convert.ToDouble() 转换为双精度 ...
- 实战:阿里巴巴 DevOps 转型后的运维平台建设
导读:阿里巴巴DevOps转型之后,运维平台是如何建设的?阿里巴巴高级技术专家陈喻结合运维自身的理解,业务场景的分析和业界方法论的一些思考,得出来一些最佳实践分享给大家. 前言 “我是这个应用 ...
- Oracle 表操作(转)
1.增加新字段:alter table table_name add (name varchar(20) default 'http://www.zangjing.net/');. 2.修改表字段:a ...
- 超详细!Github团队协作教程(Gitkraken版)
超详细!Github团队协作教程(Gitkraken版) 一.前期工作 1. 在 Github 上创建 organization step1. 登录Github网站,点击右上角头像,选择 " ...
- 控件_DatePicker
import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view ...
- 【美妙的Python之三】Python 对象解析
美妙的Python之Python对象 简而言之: Python 是能你无限惊喜的语言.与众不同. Python对象概念的理解,是理解Python数据存储的前提.Pyth ...
- 转://Oracle补丁及opatch工具介绍
一. CPU(Critical Patch Update) 一个CPU内包含了对多个安全漏洞的修复,并且也包括相应必需的非安全漏洞的补丁.CPU是累积型的,只要安装最新发布的CPU即可,其中包括之前发 ...
- jquery ajax 方法实例
每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code 直接上代码, ajax实例: $.ajax({ type : & ...
- 离线安装Cloudera Manager 5和CDH5(最新版5.9.3) 完全教程(五)数据库安装(双节点)
一.方案选择 通过Lvs+keepalived+mysql(主主同步)实现数据库层面的高可用方案,需要两台服务器作为数据库提供业务数据的存储,应用服务器通过vip访问数据库,允许同一时间内一台数据库服 ...
- 转载 jQuery和js自定义函数和文件的方法(全网最全)
jQuery和js自定义函数和文件的方法(全网最全) 版权声明:本文为像雾像雨又像风_http://blog.csdn.net/topdandan的原创文章,未经允许不得转载. https:// ...