上一篇文章说到,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 开启服务~