JS笔记(21): express

184 阅读4分钟

一、express基础

expressnose.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() 响应是重定向的 状态码302
  • res.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'));