一、express基础
express
:nose.js
web应用框架
// 引模块
const express = require('express');
const bodyParser = require('body-parser');
// 创建服务
const app = express();
const port = 8686;
app.listen(port,()=>{
//=>创建服务=>监听端口 并且以后有请求过来执行的是app这个方法
console.log(`server is success,listen on ${port}!`)
});
// 静态资源文件处理
// 浏览器中输入localhost:8686/index.html
app.use(express.static('./static'));
二、express中的中间件
当客户端向服务器端发送请求,如果请求方式是get,请求路径是'./getname'
,就会把回调函数触发执行,里面有三个参数(req,res,next)
1) 参数一:req
不是原生node中的req,他是express框架封装处理的,但也是存储了很多客户端传递的对象
req.params
存储的是路径参数信息req.path
请求的路径名称req.query
请求的问号传参的信息(get请求)(对象)req.body
当请求的方式post,基于body-parser中间件处理后,会把客户端请求主体中传递的内容存放到body属性中req.session
当我们基于express-session中间件处理后,会把session操作放到这个属性上,基于这个属性可以操作session信息req.get
获取指定的请求头信息req.param
基于这个方法可以把url-encoded格式的字符串(或者路径参数)中某一个属性名对应的信息获取到
2) 参数二:res:
提供一些属性和方法,可以供服务器端向客户端返回内容
res.cookie()
可以设置一些cookie信息,通过响应头set-cookie返回给客户端,客户端把返回的xookie信息种到本地res.json()
向客户端返回json格式的字符串,但是允许我们传递json对象,方法会帮我们转换为字符串然后再返回(执行此方法后会自动结束响应,也就是自动执行res.end)res.redirect()
响应是重定向的 状态码302res.send-status()
设置返回的状态码结束响应,把状态对应的信息当做主体响应主体返回,一般用status,然后自己来设置响应主体内容res.type()
设置相应内容的mime类型res.status()
设置响应状态码res.sendFile(path)
把path指定的文件中的内容得到,然后把内容返回给客户端浏览器(完成了文件读取和响应两步操作),也会自动结束响应操作res.send()
返回任意内容res.set()
设置响应头
3) 中间件
-
get请求,接受问号传参的信息,可以使用:
req.query / req.param()
-
post请求,接受请求主体传递的信息,需要使用一个中间件body-parser
-
中间件:在api接口请求处理之前,把一些公共的部分进行提取,中间件中就是先处理这些公共的内容,处理完成后,在继续执行接口请求即可
//中间件
app.use('/user',(req,res,next)=>{
// 请求的path地址当中是以/xxx开头的,例如:'/user' '/user/add'
next(); // 不执行next是无法走到写一个中间件或者请求中的
});
app.use((req,res,next)=>{
// 所有的请求都会走这个中间件,而且中间件执行的顺序是按照书写的先后顺序执行
next();
});
//api处理
app.get('./getname',(req,res)=>{
res.send({
message: 'ok'
});
})
// body-parser;如果是post请求,会把基于请求主体传递的信息预先截获
// 如果传递的是json格式的字符串,基于body-parser执行,会把他转化为json格式的对象
// 如果传递的是url-encoded格式的字符串,会把他转化为对象键值对的方式
// 把转化后的结果挂载到req.body属性上
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.post('/user',(req,res)=>{
console.log(req.body); //获取请求主体内容 是一个对象{xxx:xx,xxx:xx}
})
三、express中的路由
在真实项目中,为了有效的管理接口,我们会把相同功能体系的接口进行归类,在实现的时候,也会分类实现(分组管理) 例如:
/user/signin
/user/signup
/product/query
/product/search
/log/info
=> GET获取 POST设置
同一个地址因为请求方式不一样,实现不一样的功能
此类操作我们可以基于express中的路由来完成
- 1)创建一个routers文件夹,在这个文件夹中存储所有功能模块的接口信息(分类存储)
- 2)在每一个路由模块中完成api接口的编写(举例:user模块)
let express =require('express');
let router = express.Router();
// router和app相似,router有路由管理的功能
//中间件(一般写在接口的前面)
router.use((req,res,next)=>{
console.log('ok');
next();
})
router.post(`/signin`,(req,res)=>{
res.send('登陆成功');
})
router.post(`/signup`,(req,res)=>{
res.send('注册成功');
})
//把创建的路由到处,方便后续调取使用
module.exports = router;
- 3)在server.js中调取使用
const express = require('express');
const app = express();
//引入路由
app.use(`/user`,require('./routers/user'));
app.use(`/log`,require('./routers/log'));