express是什么?
基于NodeJS的框架
重点: 路由和中间件
如何使用express?
不是nodejs内置,若想使用,需要安装express框架
注意:
1)安装express之前,需要对工程进行初始化
npm init
该命令会在工程中产生一个package.json的文件(项目的清单文件),文件常见内容说明:
main: 入口文件
script:项目中配置的脚本命令 npm run 命令名称
2)安装express
npm install express --save 或者
cnpm install express --save
3)使用express
const express= require('express');//引入框架
const app= express();//执行框架函数,express实例
//路由分发机制
//路由匹配
//指定路由 接收get请求
//在原生代码中需要createServer方法创建服务器,express中不需要使用该方法创建服务器
//get方法可以接收get请求
//接收get请求的 根路径请求
//当接收到客户端请求时,就触发服务器,判断是post或者是get请求,判断完毕之后,进入对应的路由匹配
app.get('/',(req,res)=>{
// res.end('hello');//node原生方法
// res.send('hello');//发送 将数据发送给客户端,结束请求
res.send('成功');
// res.send({code:200,msg:"成功,hello"});
});
app.get('/login',(req,res)=>{
res.end('登录');
})
//post方法可以接收post请求
app.post('/',(req,res)=>{
res.end('post');
});
//启动服务器,监听指定端口
app.listen(3000);
3.express中常见的路由配置
路由由请求方法和路径共同组成。只有请求方法和路径都匹配,才会执行路由对应的回调函数
Express中可以配置路由的方法:
get(path,callback) get请求
post(path,callback) post请求
all(path,callback) 接收所有的请求
route(path).get(callback).post(ballback) 中转作用
4.请求参数
1)传统方案传递参数:
http://localhsot:3000?username=jack&pwd=124
get请求,请求参数可以通过request对象的query属性来获取
app.get('/',(req,res)=>{
console.log(req.query);//get请求参数
res.send('get');
});
post请求的参数,不可以使用query对象来获取,
可以监听data和end事件来读取数据
2)通过参数路径的配置来传递参数
// login?username=admin&pwd=123
// login/admin/123
app.get('/login/:username?/:pwd?',(req,res)=>{
console.log(req.params);
res.send('login');
});
注意:通过路径参数传递,也要满足路径匹配原则,例如:上例中,username和pwd参数可以传递也可以不传递(因为使用正则的?来修饰,若没有修饰,则两个参数都必须传递,否则不能匹配)
总结:两种参数传递方案对比
1)路径参数相比于查询字符更具有隐蔽性
2)路径参数配合正则表达式可以实现更加强大的功能
3)查询字符的穿地方方案不能控制用户是否传递了参数,若有些参数是必传的内容,则使用路径参数更加合理。
5.请求路径
在express中,请求路径支持正则匹配原则
?
+
*
/*
正则字符:
? 零次或一次
* 任意字符
+ 一次或多次
*/
// /a 或者 /ab
// app.get('/ab?',(req,res)=>{
// res.send('ab路由');
// });
// a(bc)? --> bc可以出现0次或者一次
// a(bc)+ --->bc可以出现一次或者多次
app.get('/a(bc)+',(req,res)=>{
res.send('ab路由');
});
6.设置请求头信息
可以使用原生的NodeJS中的方法
setHeader() writeHead()
也可以使用express带的方法:
set()
header()
//原生node
res.setHeader("Access-Control-Allow-Origin",'*');
res.setHeader('content-type',"text/plain;charset=utf8");
// res.writeHead(200,{
// "Access-Control-Allow-Origin":'*'
// });
//express
// res.set("Access-Control-Allow-Origin",'*');
// res.header("Access-Control-Allow-Origin",'*');
// res.header({
// "Access-Control-Allow-Origin":'*'
// });
注意:若使用writeHead()搭配send()方法使用时,需要注意,writeHead方法只能执行一次,send默认会设置头信息,有可能报错
7.response对象的响应方法:
send end render
中间件的使用:
中间件(middleware)就是一个方法,但是一般情况下,中间件方法需要携带next参数
使用中间件:
app.use(path,callback);
use方法的使用类似all方法,都是能够接收任何请求,例如:get、post、put/delete…
二者的路径匹配规则不一致:
all()的路径匹配是一个精准匹配(必须相等才可以)
use()定义的路径,是一个一级路由,意味着,在后面追加任意路由均可匹配
例如:
/ 匹配:/, /apple ,/index …一切都可以匹配
/index 只能匹配:以/index为一级路由的路由,例如:/index, /index/admin,…