上一篇文章说到,nodejs获取客户端申请须要咱们本人去解决申请参数、申请形式等,而在express框架外部集成了很多好用的办法,咱们不须要从0开始编写各种解决逻辑,这样能够极大进步咱们的开发效率~

通过引入 express ,再执行express函数,生成的app对象通过中间件来进行各种操作。

const express = require('express')const app = express()app.post('/home', (req, res, next)=>{    res.end('hello express')})app.listen('8000', ()=>{})

app属性中有get/post/put/delete等等办法来接管不同申请形式的申请数据,这些办法都属于中间件,另外,它还有use办法能够接管所有类型的申请,并且express中的中间件是能够应用多个的,首先匹配第一个符合条件的中间件来解决申请并响应,如果须要执行多个中间件,可通过中间件回调函数中的第三个参数 next,来执行下一个可匹配的中间件。

const express = require('express')const app = express()app.use('/', (req, res, next)=>{  console.log('匹配到了use中间件')  next()})app.post('/home', (req, res, next)=>{    console.log('匹配到了post中间件')    res.end('hello express')})app.listen('8000', ()=>{  console.log('开启8000端口')})

因为中间件的这个个性,就能够依据不同的申请类型来对立解决数据,罕用的申请形式和类型总共有5种,get申请中有两种,别离是 params 和 query 传参。
params 传参的格局相似于 localhost:8000/goods/1,这个数字1就是动静传入的,query传参的格局相似于 localhost:8080/login?name=kiki,在问号前面应用键值对的模式拼接参数。

express的解决形式非常简单,通过回调函数中 req.params 和 req.query即可获取

app.get('/goods/:id', (req, res, next)=>{  console.log(req.url)  console.log(req.params)  res.end('params')})app.get('/login', (req, res, next)=>{  console.log(req.url)  console.log(req.query)  res.end('query')})

post申请中还有另外三种常见的申请类型,别离是 json、urlencoded和form-data。
json字符串示意传递的数据是键值对的模式,格局如 { "name": "kiki", password: 666 },urlencode 格局如 name=kiki&password=666,而form-data就是表单提交的模式,通常用于文件上传。

// 获取 json格局的申请参数app.use(express.json());//  获取 urlencoded 格局的申请参数app.use(express.urlencoded({extended: true}));// 在下一个匹配的post申请里通过 req.body 来获取, 有兼容性问题, 须要express4.16以上app.post('/login', (req, res, next) => {  console.log(req.body);  res.end("login success");});

表单提交的解决形式会略微简单一点,须要装置第三方库 multer 来解决

const express = require('express')const multer = require('multer')const app = express()const upload = multer()// 传递非文件类型时, 应用upload.any(),传递文件类型时 upload.array("file")app.use('/login', upload.array("file"), (req, res, next)=>{    console.log(req.files)   console.log(req.body)   res.end('form-data') }) app.listen(8000, () => {  console.log('开启8000端口')});

上图以form-data的模式发送了一个post申请,申请里包含了非文件和文件类型,req.body能够获取非文件信息,通过req.files能够获取文件信息,文件信息的内容以buffer二进制数据的模式获取,可自行对上传的文件进行解决。

说完了解析参数,再来看看对客户端的申请做出响应,包含设置响应状态码,响应的参数类型,响应的具体内容

app.get('/login', (req, res, next) => {  console.log(req.query);  // 设置响应码  res.status(200);    // 设置响应类型  res.type("application/json");  res.end(JSON.stringify({name: "kiki", age: 16}));    // 以上两行能够合并成 res.json({name: "kiki", age: 16});});

再来看看express略微简单一点的用法,当咱们通过express提供的接口是 restful类型的时候,同样一个路由地址,可能对应着多种申请形式,如get/post/put/delete。
如果每一种申请形式都写一次,代码变得难浏览和保护,咱们此时能够思考按接口抽取成独自的路由文件,比方对立匹配/user接口,get申请 /user 时获取所有的user信息,get申请/user/id 时获取某个id的user信息,post申请 /user 时新增用户信息,put申请 /user 时批改用户信息,delete申请 /user 时删除用户。
通过express的Router办法创立router对象,定义所有须要的申请办法,最初导出router对象。

const express = require('express')const router = express.Router()router.get('/', (req, res, next)=>{  res.json([{    name: 'alice', age: 17  },{    name: 'lili', age: 16  }])})router.get('/:id', (req, res, next)=>{  res.json({ name: 'alice', age: 17 })})router.post('/', (req, res, next)=>{  res.json('post')})router.put('/', (req, res, next)=>{  res.json('put')})router.delete('/', (req, res, next)=>{  res.json('delete')})module.exports = router;

以上为定义的user文件,能够看到以上的路由是不蕴含/user这个通用的路由的,因为它被定义在了主入口处,主入口文件引入以上的js文件,将导入的router作为中间件传入到use办法中,这样就能够用四种不同的形式调用同一个接口。

const express = require('express')const userRouter = require('./routers/user')const app = express()app.use('/user', userRouter)app.listen(8000, ()=>{})

还有一个比拟重要的就是解决申请中的谬误,在下面的中间件应用过程中,next办法用于执行下一个匹配的两头,括号里是不须要传参数的,而当须要处理错误的时候,就能够在next中传入参数,而后再定义一个公共的处理错误的中间件。

const express = require('express')const app = express()const NOT_FIND = 'NOT_FIND'const TIME_OUT = 'TIME_OUT'app.get('/login', (req, res, next)=>{  next(new Error(NOT_FIND))})app.get('/home', (req, ers, next)=>[  next(new Error(TIME_OUT))])app.use((error, req, res, next)=>{  console.log('>>>>>>>>>error', error)  let code = 400;  let message = ''  switch(error.message){    case NOT_FIND:      message = '您的信息有误'      break;    case TIME_OUT:      message = '已超时';      break;    default:      break;     }  res.json({    code,    message  })})app.listen(8000, ()=>{})

以上就是express中对于开启服务的局部,nodejs中的相干常识能够参考这一篇nodejs中如何应用http创立一个服务 下一篇聊聊Koa开启服务~