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'))
注:前缀前面的“/”必须要加,否则就错。