EXPRESS--router

本文深入讲解了Express.js中的路由配置,包括子路由、路径大小写敏感性、严格路径匹配、链式路由设置以及请求参数处理等内容,并介绍了如何利用中间件进行路径匹配和参数验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

router对象:

1.充当子路由

var express = require("express");
var app = express();
var router = express.Router();
router.get('/test',function(req,res,next){
	res.send('test')
});
app.use('/user/:name',router);
app.listen(3000);
    当访问http://localhost:3000/user/jack/test时,页面显示test
router.get('/test',function(req,res,next){
	res.send('test')
});//是一个子路由,相对于/user/:name,这是因为app.use('/user/:name',router);

var express = require("express");
var app = express();
var router = express.Router();
router.get('/test',function(req,res,next){
	res.send(req.params.name)
});
app.use('/user/:name',router);

app.listen(3000);
当访问http://localhost:3000/user/jack/test时,页面没有内容,这是因为父级路由没有合并到子级路由,

var router = express.Router({
mergeParams:true
});父级路由合并到子级路由

var express = require("express");
var app = express();
var router = express.Router({
	mergeParams:true
});
router.get('/test',function(req,res,next){
	res.send(req.params.name)
});
app.use('/user/:name',router);

app.listen(3000);
当访问http://localhost:3000/user/jack/test时,页面显示jack

当访问http://localhost:3000/user/jack/Test时,页面显示jack

test中字母的大小写没有区分,若要区分子路由中的大小写
2.路径大小写:

var express = require("express");
var app = express();
var router = express.Router({
	mergeParams:true,
	caseSensitive:true
});
router.get('/test',function(req,res,next){
	res.send('test')
});
router.get('/Test',function(req,res,next){
	res.send('Test')
});
app.use('/user/:name',router);

app.listen(3000);
访问http://localhost:3000/user/jack/Test  页面显示Test

访问http://localhost:3000/user/jack/test  页面显示test
3.严格路径:

var express = require("express");
var app = express();
var router = express.Router({
	
});
router.get('/test',function(req,res,next){
	res.send('test')
});
app.use('/user/:name',router);
app.listen(3000);
http://localhost:3000/user/jack/test

http://localhost:3000/user/jack/test/
访问上面的两个网址结果相同,若要区分上面的两个网址,就要使用

var router = express.Router({
  strict:true
});
二.

var router = express.Router({
  mergeParams:true,
  caseSensitive:true,
  strict:true	
});//只是针对router对象下的路径
app下的路由如果要设置,则

app.set('strict routing',true);
app.set('case sensitive',true);

三.链式路由:如果要使用router设置路由,则必须有app.use(router);设置父级路由

   var express = require("express");
   var app = express();
   var router = express.Router();
   router.get('/test',function(req,res,next){
     	console.log('get one');
     	next();
     })
    router.get('/test',function(req,res,next){
     	console.log('get two');
     	res.send("test ok");
     })
    app.use(router);//必须存在父级路由
    app.listen(3000);
如果要写成链式,则要使用router对象下的route()方法
var express = require("express");
var app = express();
var router = express.Router();
router.route('/test')
     .get(function(req,res,next){
     	console.log('get one');
     	next();
     })
     .get(function(req,res,next){
     	console.log('get two');
     	res.send("test ok");
     })
     .post(function(req,res,next){
     	console.log('post one');
     	next();
     })
     .post(function(req,res,next){
     	console.log('post two');
     	res.send("test ok");
     })
    app.use(router);
app.listen(3000);
如果app对象要设置链式路由,就要使用app对象下的route()方法
var express = require("express");
var app = express();
app.route('/test')
	  .get(function(req,res,next){
	     	console.log('app get one');
	     	next();
	     })
	 .get(function(req,res,next){
	 	console.log('app get two');
	 	res.send("test ok");
	 })
app.listen(3000);
请求参数处理:

var express = require("express");
var app = express();
app.get("/user/:id",function(req,res,next){
    res.send("用户ID:" + req.params.id);
});
app.listen(3000);
app.params('id',function(){})用来处理逻辑,使app.get()只处理正确逻辑
var express = require("express");
var app = express();
app.get("/user/:id",function(req,res,next){
	if(req.params.id !=='001'){
		res.send(404);
	}else{
		res.send("用户ID:" + req.params.id);
	} 
});
app.listen(3000);
上述代码,所有逻辑都放在一个函数中,不清晰
var express = require("express");
var app = express();
app.param('id',function(req,res,next,id){
	if(req.params.id !=='001'){
		res.send(404);
	}else{
		next();
	} 
})
app.get("/user/:id",function(req,res,next){
	res.send("用户ID:" + req.params.id);
});
app.listen(3000);
router对象也存在param()方法

var express = require("express");
var app = express();
var router = express.Router();
router.param('id',function(req,res,next,id){
	console.log(id);
	next();
})
router.get("/user/:id",function(req,res,next){
	res.send("用户ID:" + req.params.id);
});
app.use('/',router);
app.listen(3000);
app对象下的param()第一个参数可以是数组router.param(['id','name'],function(req,res,next,value){}),value的值不确定,因为会执行两次回调函数,第一次value是id,第二次value的值是name,第一个参数不建议用数组形式,用字符串形式。

router对象下的param()第一个参数只能是字符串router.param('id',function(req,res,next,id){})

Use用法:
添加中间件:
给req对象添加myname属性,不写路径,默认’/’,’/’下的任何路径,req对象都会添加myname属性,正则匹配是包含关系
http://localhost:3000
http://localhost:3000/test
中的req对象都会添加myname属性

var express = require("express");
var app = express();
var router = express.Router();
app.use(function(req,res,next){
	req.myname = 'Jack';
	next();
});
app.get('/',function(req,res){
	res.send('My name is' + req.myname);
});
app.get('/test',function(req,res){
	res.send('Test' + req.myname);
});
app.listen(3000);
设置子路由:

子路由路径是相对父级路由的

var express = require("express");
var app = express();
var router = express.Router();
app.use('/myrouter',router);
router.get('/test',function(req,res){
	res.send('sub router test');
});
app.listen(3000);
访问http://localhost:3000/myrouter/test,页面显示sub router test

静态资源访问:

var express = require("express");
var app = express();
app.use(express.static('public', {
	index: index.html,
	extensions: [‘html’, ’htm’],
	dotfiles: ’allow’
}));

app.listen(3000);
index: index.html,表示访问http://localhost:3000/就相当于访问
http://localhost:3000/index.html
extensions: [‘html’, ’htm’],
表示访问http://localhost:3000/index,找不到index文件时,就找index.html文件,如果还找不到,就找index.htm文件
dotfiles: ’allow’表示可以允许访问.xxx文件,名字以.开头
可以设置两个静态文件
app.use(express.static('public'));
app.use(express.static('static'));
在第一个静态文件夹public中找不到资源时,就在第二个静态文件夹static中寻找资源。


app.use()也是一个中间件。与getpost不同的是,他的网址不是精确匹配的。而是能够有小文件夹拓展的。

大多数情况下,渲染内容用res.render(),将会根据views中的模板文件进行渲染。如果不想使用views文件夹,想自己设置文件夹名字,那么app.set("views","aaaa");



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值