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时,页面显示testrouter.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()也是一个中间件。与get、post不同的是,他的网址不是精确匹配的。而是能够有小文件夹拓展的。
大多数情况下,渲染内容用res.render(),将会根据views中的模板文件进行渲染。如果不想使用views文件夹,想自己设置文件夹名字,那么app.set("views","aaaa");