Express 是基于 Node.js 平台,快速、开放、极简的 Web 开发框架。搭建web服务器
Express 的本质:就是一个 npm 上的第三方包,提供了快速创建 Web 服务器的便捷方法。
使用Express开发框架可以非常方便、快速的创建Web网站的服务器或API接口的服务器
官网:Express - 基于 Node.js 平台的 web 应用开发框架 - Express 中文文档 | Express 中文网
使用步骤:
- 导入包
- 创建服务器
- 处理请求
- 监听端口
代码:
//第一步: 导入express
const express = require('express');
// console.log(express); // 输出为一个函数
//第二步:创建服务器 :只需要调用express 函数就可以啦
let server = express();
// 第三步:监听端口
server.listen(1111, () => {
console.log('服务器已经开启,运行在 http://localhost:1111');
})
// 第四步:对请求做出响应
// 使用server 服务器处理get 根请求
server.get('/', (req, res) => {
res.end('ok')
})
路由方法:
请求方法还支持:
get - 查询请求 - 条件在地址栏
post - 新增请求 - 数据在请求主体
put - 修改请求 - 条件在地址栏 - 数据在请求主体
delete - 删除请求 - 条件在地址栏
各个动词方法用来处理对应的请求。不过有一个方法除外:
app.all() // 可以用来处理任意请求方式虽然all方法可以处理任意请求,但是尽量少用,甚至尽量不要使用。
使用postman进行调试
路由路径:
完全匹配:
// get 获取信息请求
app.get('/', (req, res) => {
res.end('get')
})
// post 提交信息请求
app.post('/index', (req, res) => {
res.end('post')
})
// put 编辑信息请求 - 用的不多
app.put('/info', (req, res) => {
res.end('put')
})
// delete 删除信息请求 - 用得不多
app.delete('/del', (req, res) => {
res.send('del')
})
不完全匹配:
// ? 代表匹配前面的字母出现 0 或 1 次 abcd / acd
app.get('/ab?cd', (req, res) => {
res.end('ok')
})
// + 代表匹配前面的字母出现 1 或 n 次 abcd / abbbcd
app.get('/ab+cd', (req, res) => {
res.end('ok')
})
// * 代表匹配*这里可以出现任意个字母 abcd / abeecd
app.get('/ab*cd', (req, res) => {
res.end('ok')
})
// () 代表是一组 cd / abcd
app.get('/(ab)?cd', (req, res) => {
res.end('ok')
})
正则匹配:
// 匹配任何路径中含有 a 的路径:
app.get(/a/, function(req, res) {
res.send('/a/');
});
// 正则表达式 匹配以/api开头的路径
app.get(/^/api/, (req, res) => {
res.end('api')
})
restful风格
// 对于页面请求路径为 http://localhost:3000/index/100 的路径时,接口对应地址可以是'/index/:id'
// id 就是请求路径对应的参数
app.get('/index/:id', (req, res) => {
res.end('success')
})
restful风格约束:
路由中不能出现动词,即:get/post/put/delete
路由结尾不能有/
使用-来替换_
建议使用小写字母
使用复数形式
推荐标准状态码:
- 200 ok 服务器返回用户请求的数据
- 201 created 新建或修改操作成功
- 204 not content 删除数据成功
- 400 bad request 用户发出的请求有问题
- 401 unauthoried 表示用户没有认证,无法进行操作
- 403 forbidden 用户访问是被禁止的
- 422 unprocesable entity 当创建一个对象时,发生一个验证错误
- 500 internal server error 服务器内部错误,用户将无法判断发出的请求是否成功
- 503 service unavailable 服务不可用装填,多半是因为服务器问题,例:cpu占用率大...
路由的多次处理
多次处理:这就是中间件
// app 是创建的服务器名称
app.get('/', (req, res, next) => {
// req 请求报文
// res 响应报文
// next 放行,该函数中暂时不处理响应,交给下一个函数进行处理.
console.log('1');
next()
}, (req, res) => {
console.log('2');
res.end('success')
})
也可以将多个回调函数放在一个数组里处理路由:
server.get('/', [
function (req, res, next) {
console.log('1');
next()
},
function (req, res, next) {
console.log('2');
next()
},],
function (req, res, next) {
console.log('3');
res.end('success')
})
响应方法
const express = require('express')
const app = express()
app.listen(3000, () => {
console.log('服务器启动了');
})
// 处理请求
app.get('/', (req, res) => {
res.send('这是根请求')
})
// 响应方式
app.get('/list', (req, res) => {
// 1. end 中文乱码
res.end('响应成功')
// 2. send 解决中文乱码 等价于 res.end(res.setHeader('content=type','text/html;charset=utf-8'))
res.send('响应成功')
// 3. 响应 json 格式数据
res.json({
code: 200,
msg: '请求成功',
data: []
})
// 4. redirect 重定向到其他请求
res.redirect('/')
// 5. sendFile(文件路径) 发送一个文件给前端 - 必须是绝对路径
// __dirname是nodejs内置的跟踪根路径
// 使用 path.join 拼接文件名和跟路径 - 组成绝对路径
res.sendFile(require('path').join(__dirname, 'index.html'))
// 6. sendStatus 设置响应状态码
res.sendStatus(404)
})
静态资源托管
express提供了一个非常好用的方法,叫做 express.static(项目目录),通过此方法,可以非常方便地创建一个静态web资源服务器:
app.use(express.static('public'))
// app.use()表示使用(中间件)
// 现在可以访问public目录下所有的文件
// 如public/aa.jpg文件,则可以通过 : http://xxxx/images/aa.jpg
express还支持给静态资源文件创建一个虚拟的文件前缀(实际上文件系统中并不存在),可以使用 express.static 函数指定一个虚拟的静态目录,就像下面这样:
前缀的使用意义:
- 可以迷惑别人,一定程度上阻止别人猜测我们服务器的目录结构
- 可以帮助我们更好的组织和管理静态资源
语法:app.use('/static', express.static('public'))
注: 前缀前面的“/”必须要加,否则就错。