expressjs路由匹配规则

expressjs作为nodejs的MVC框架,其路由规则与大部分其他MVC框架类似,略有不同,研究后做个小记。

expressjs路由在app.js中配置,app.js源码如下(不同的版本会有所不同,以下为express 4.13.1):

 1 var express = require(‘express‘);
 2 var path = require(‘path‘);
 3 var favicon = require(‘serve-favicon‘);
 4 var logger = require(‘morgan‘);
 5 var cookieParser = require(‘cookie-parser‘);
 6 var bodyParser = require(‘body-parser‘);
 7
 8 var routes = require(‘./routes/index‘);
 9 var users = require(‘./routes/users‘);
112 var app = express();
13
14 // view engine setup
15 app.set(‘views‘, path.join(__dirname, ‘views‘));
16 app.set(‘view engine‘, ‘jade‘);
17
18 // uncomment after placing your favicon in /public
19 //app.use(favicon(path.join(__dirname, ‘public‘, ‘favicon.ico‘)));
20 app.use(logger(‘dev‘));
21 app.use(bodyParser.json());
22 app.use(bodyParser.urlencoded({ extended: false }));
23 app.use(cookieParser());
24 app.use(express.static(path.join(__dirname, ‘public‘)));
25
26 app.use(‘/‘, routes);
27 app.use(‘/users‘, users);30 // catch 404 and forward to error handler
31 app.use(function(req, res, next) {
32   var err = new Error(‘Not Found‘);
33   err.status = 404;
34   next(err);
35 });
36
37 // error handlers
38
39 // development error handler
40 // will print stacktrace
41 if (app.get(‘env‘) === ‘development‘) {
42   app.use(function(err, req, res, next) {
43     res.status(err.status || 500);
44     res.render(‘error‘, {
45       message: err.message,
46       error: err
47     });
48   });
49 }
50
51 // production error handler
52 // no stacktraces leaked to user
53 app.use(function(err, req, res, next) {
54   res.status(err.status || 500);
55   res.render(‘error‘, {
56     message: err.message,
57     error: {}
58   });
59 });
60
61
62 module.exports = app;

先对app.js进行说明,app.js文件中包含以下功能块:

1.模块的加载

 1 var express = require(‘express‘);
 2 var path = require(‘path‘);
 3 var favicon = require(‘serve-favicon‘);
 4 var logger = require(‘morgan‘);
 5 var cookieParser = require(‘cookie-parser‘);
 6 var bodyParser = require(‘body-parser‘);
 7
 8 var routes = require(‘./routes/index‘);//express默认生成的index和users文件
 9 var users = require(‘./routes/users‘);

2.设置视图view和模板引擎(express默认jade)

15 app.set(‘views‘, path.join(__dirname, ‘views‘));
16 app.set(‘view engine‘, ‘jade‘);//express默认为jade,如果想用ejs模板,直接修改,前提是要安装。

3.中间件配置app.use

8 // uncomment after placing your favicon in /public
19 //app.use(favicon(path.join(__dirname, ‘public‘, ‘favicon.ico‘)));
20 app.use(logger(‘dev‘));
21 app.use(bodyParser.json());
22 app.use(bodyParser.urlencoded({ extended: false }));
23 app.use(cookieParser());
24 app.use(express.static(path.join(__dirname, ‘public‘)));

4.配置路由

26 app.use(‘/‘, routes);//将routes模块提交给app
27 app.use(‘/users‘, users);//将users模块提交给app

第一个参数为路由路径,即url路径;第二个参数为模块名称,即在加载模块的时候赋予的变量名。

也就是将该路径与模块建立映射关系,如/users路径将于users模块建立关系。当输入url请求过来后,express会解析到相应的模块去处理请求,如上users.js模块。

在users.js中可以直接返回数据或者加载视图。

如果要加载视图,那么该路径一定要与view中的目录结构相匹配,否则无法加载。例如路由是/new/newslist,那么视图view下要有匹配的目录/views/new/newslist。

routes的目录与views目录结构相对应,才能加载成功。express根据路由/new/newslist去找routes下的newslist.js模块(文件),newslist.js文件中通过render去加载视图,代码如下:

var express = require(‘express‘);
var router = express.Router();//从express中取出router

/* GET users listing. */
router.get(‘/‘, function(req, res, next) {
  res.render(‘newslist‘, { title: ‘Express‘ });
});

module.exports = router;

express会根据之前配置的路由去views下找相应的模板文件viewslist.jade进行操作。

5.处理404和500错误

 // catch 404 and forward to error handler
31 app.use(function(req, res, next) {
32   var err = new Error(‘Not Found‘);
33   err.status = 404;
34   next(err);
35 });
36
37 // error handlers
38
39 // development error handler
40 // will print stacktrace
41 if (app.get(‘env‘) === ‘development‘) {
42   app.use(function(err, req, res, next) {
43     res.status(err.status || 500);
44     res.render(‘error‘, {
45       message: err.message,
46       error: err
47     });
48   });
49 }
50
51 // production error handler
52 // no stacktraces leaked to user
53 app.use(function(err, req, res, next) {
54   res.status(err.status || 500);
55   res.render(‘error‘, {
56     message: err.message,
57     error: {}
58   });
59 });
时间: 2024-12-10 14:11:41

expressjs路由匹配规则的相关文章

Go的http包中默认路由匹配规则

# 一.执行流程 首先我们构建一个简单http server: ```go package main import ( "log" "net/http" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { w.Write([]byte("hello world")) }) log.Fatal(http.Liste

Vue系列之 => 路由匹配

1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> 6 <meta http-equiv="Content-Type"

ASP.NET MVC API 路由生成规则

我们都知道调用ASP.NET MVC的某些API函数(诸如:Url.Action.RedirectToAction等)可以生成URL,ASP.NET MVC会根据调用API函数时传入的参数去匹配系统定义的路由(Route),然后通过匹配成功的路由去生成相应的URL. ASP.NET MVC会依次根据如下三个规则生成URL: 调用ASP.NET MVC API函数时传入的参数信息 当前请求的URL(就是Request.Url)和系统中定义路由匹配(按照路由表定义的顺序,从上往下匹配)后的匹配值 系

Vue-router 动态路由匹配

Vue-router 动态路由匹配 路由参数变化 举例: const router = new VueRouter({ routes: [ // 动态路径参数 以冒号开头,  /user/foo 和 /user/bar 都将映射到相同的路由 { path: '/user/:id', component: User } ] }); /user/:username/post/:post_id 多个路由变量,也都可以再 this.$route.params中获取 注意: 从 /user/foo 到 /

四十七、django路由匹配,分组,反向解析,路由分发,视图层

路由匹配: urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^text', views.text), url(r'^testadd', views.testadd), ] 第一个参数是一个正则表达式,也就意味着在路由的匹配的时候,是按照正则匹配的规则去匹配, 路由匹配的顺序是从上往下依次匹配,所有如上两个路由test前面一样,第三个路由一直会匹配不上 正确写法: urlpatterns = [ url(r'^admin/', adm

08.vue-router动态路由匹配

动态匹配路由的基本用法 思考: <!-有如下3个路由链接.-> <router-link to="/user/1">User1</router-link> <router-link to="/user/2">User2</router-link> <router-link to="/user/3">User3</router-link> //定义如下三个对应的路由

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则 用了几天时间看了一下开源框架Caliburn.Micro 这是他源码的地址http://caliburnmicro.codeplex.com/ 文档也写的很详细,自己在看它的文档和代码时写了一些demo和笔记,还有它实现的原理记录一下 学习Caliburn.Micro要有MEF和MVVM的基础 先说一下他的命名规则和引导类 以后我会把Caliburn.Micro的 Actions IResult,IHandle ICondu

在JaveWeb项目中配置Spring 匿名访问时,匹配规则的变相实现/*

实现/* /** * 根据当前的URL返回该url的角色集合. * 1.如果当前的URL在匿名访问的URL集合当中时,在当前的角色中添加匿名访问的角色(SysRole.ROLE_CONFIG_ANONYMOUS). * 2.如果当前系统不存在的情况,给当前用户添加一个公共访问的角色(SysRole.ROLE_CONFIG_PUBLIC). 3.url * 和角色映射,url和参数映射,给当前用户添加一个公共的角色(SysRole.ROLE_CONFIG_PUBLIC). * * @param o

VS2013和VS2015中MVC 区域路由匹配顺序相反

创建测试工程 分别在vs2013和vs2015中创建mvc项目,并创建First.Second.Three三个Area,每个Area下面创建一个HomeController和Index视图.修改RouteConfig.cs中的路由注册方法,添加命名空间 public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.M