express
概述
express
是一个提供
web
服务的框架(内置
http
模块),他简化了
http
的相关内容,将对应的内容封装
为了特定的方法。
中文网
express
入门
安装
导入
入门案例
express
里面相关对象
express
(静态方法 服务相关方法)
urlencoded
转换
body
的数据
static
将静态资源变成一个服务
json
读取相关
json
文件
Router
返回一个路由对象
....
npm i express -S
const express = require('express')
//
导入
express
是一个函数
const
express
=
require
(
'express'
)
//createApplication
其实就是导出的
express
let
app
=
express
()
//
应用对象
//
根据对应的请求来进行处理
get
处理
get
请求
post
处理
post
请求
put
处理
put
请求
delete
处理
delete
请求
//
传入路由地址 处理函数
(
请求对象 响应对象 进行下一步处理的函数
)
app
.
get
(
'/'
,(
req
,
res
,
next
)
=>
{
res
.
setHeader
(
'content-type'
,
'text/html;charset=utf-8'
)
res
.
end
(
'
主页访问
'
)
})
//
监听端口 如果不传入对应的
ip
地址和端口默认
ip
为
localhost
默认端口
3000
app
.
listen
(
8080
,
'127.0.0.1'
,()
=>
{
console
.
log
(
'
当前服务已经启动
'
);
})
application
(应用相关方法)
方法
get
接收
get
请求
post
接收
post
delete
接收
delete
请求
put
接收
put
请求
all
所有请求都可以接收
listen
监听对应的端口号
use
中间件使用(加载某些功能件加载到对应的应用使用中)
disable
禁用某个设置
disabled
是否禁用
//app
中间件引入
app.use(express.urlencoded())//body
数据获取及转换
//
访问路径 不加默认为
/
app.use('/public',express.static('./img')) //
静态资源管理(默认情况不可以被外界访问)
app.use(express.json()) //json
文件读取相关
let router = express.Router() //
路由对象
enable
开启某个设置
enabled
是否开启
set
配置某个设置
get
获取某个设置
app.route
路由规则加载
render
渲染
engine
模板引擎配置
request
(请求对象)
app
.
get
(
'/'
,(
req
,
res
)
=>
{
res
.
json
({
message
:
'get'
})
})
app
.
post
(
'/'
,(
req
,
res
)
=>
{
res
.
json
({
message
:
'post'
})
})
app
.
delete
(
'/'
,(
req
,
res
)
=>
{
res
.
json
({
message
:
'delete'
})
})
app
.
put
(
'/'
,(
req
,
res
)
=>
{
res
.
json
({
message
:
'put'
})
})
app
.
all
(
'/'
,(
req
,
res
,
next
)
=>
{
res
.
json
({
message
:
'all'
})
})
app
.
set
(
'a'
,
'a'
)
console
.
log
(
app
.
disabled
(
'a'
));
app
.
disable
(
'a'
)
console
.
log
(
app
.
disabled
(
'a'
));
console
.
log
(
app
.
enabled
(
'a'
));
app
.
enable
(
'a'
)
console
.
log
(
app
.
enabled
(
'a'
));
console
.
log
(
app
.
get
(
'a'
));
let
router
=
express
.
Router
()
//
路由对象
//
中间件使用
app
.
use
(
router
)
属性
req.body
获取请求体
(body-parser)
req.query
获取
?
后面携带的参数
req.params
获取
/
后面传递的参数
req.headers
获取请求头
req.cookies
获取对应的
cookie
req.baseUrl
请求的根路径
req.method
请求的方式
....
//
如果需要获取
body
里面的数据那么需要调用
body-parse
//use
中间件使用
app
.
use
(
express
.
urlencoded
())
response
(响应对象)
方法
res.json
发送
json
数据
app
.
post
(
'/test/:username'
,(
req
,
res
,
next
)
=>
{
console
.
log
(
req
.
body
);
//
必须引入
body-parase
的中间件
console
.
log
(
req
.
query
);
//
获取的是一个对象
?
传参
console
.
log
(
req
.
params
);
//
获取是一个对象
:
属性名 通过这个属性名就能获取对应
/
传递的参
数
console
.
log
(
req
.
headers
);
//
返回是一个对象
console
.
log
(
req
.
cookies
);
console
.
log
(
req
.
ip
);
console
.
log
(
req
.
hostname
);
//
调用
urlencoded
res
.
send
({
message
:
'post
请求
'
})
})
res.send
发送数据
res.jsonp json
数据响应
res.render
服务器渲染(
SSR
)
res.redirect
重定向
res.status
状态码设置
res.append
追加响应
res.sendFile
发送文件
res.download
下载
res.sendStatus
发送状态码
...
router
(路由)
方法
all
get
post
...
MVC/
三层架构
概述
:
MVC
是一种模型,分别为
model
数据,
view
视图,
controller
控制。三层架构是指后端的包(文件夹)
分的层级最少分三层,这个三层分别是
web
层(处理请求及对应的接口书写),
service
(业务层 处理
对应的业务),
dao
(数据库相关操作)。
mvc
是三层架构中
web
层的体现。
三层架构划分
主文件
app.js
controller
层
usercontroller
service
层
userService
const
express
=
require
(
'express'
)
const
{
userRouter
}
=
require
(
'./controller/userController'
)
//
新建一个应用对象
const
app
=
express
()
//
中间件使用
app
.
use
(
express
.
urlencoded
())
app
.
use
(
express
.
static
(
'./public'
))
//
路由引入
app
.
use
(
'/user'
,
userRouter
)
//
监听
app
.
listen
(
8080
,()
=>
{
console
.
log
(
'
当前服务已经启动
'
);
})
//
分离
controller
主要使用的路由分离
const
express
=
require
(
'express'
)
const
{
getUserById
}
=
require
(
'../service/userService'
)
//
新建一个路由对象
const
userRouter
=
express
.
Router
()
//
书写对应的接口
userRouter
.
get
(
'/:id'
,
getUserById
)
module
.
exports
=
{
userRouter
}
//
导入对应的
dao
const
{
findUserByID
}
=
require
(
'../dao/userDao'
)
//
返回的构造
function
Response
(
data
=
{},
message
=
'OK'
,
code
=
'0000'
){
this
.
data
=
data
,
this
.
message
=
message
,
this
.
code
=
code
}
const
getUserById
=
(
req
,
res
,
next
)
=>
{
//
得到对应的
id
let
id
=
req
.
params
.
id
//
查询对应的用户数据返回
findUserByID
(
id
).
then
(([
user
])
=>
{
res
.
send
(
new
Response
(
user
))
})
}
module
.
exports
=
{
getUserById
}
dao
层
userDao
注册实现
dao
层
service
层
导入加密模块
代码实现
密钥生成(
openssl
)
私钥(加密)(
rsa
非对称)
//
导入对应的工具类 进行相关
sql
语句执行
const
{
execu
}
=
require
(
'../utils/mysqlUtil'
)
//
根据
id
进行查找
const
findUserByID
=
(
id
)
=>
execu
(
'select * from t_user where id = ?'
,
id
)
module
.
exports
=
{
findUserByID
}
//
添加用户
const
saveUser
=
(
user
)
=>
execu
(
'insert into
t_user(username,password,age,address)
values(?,?,?,?)'
,
user
.
username
,
user
.
password
,
user
.
age
,
user
.
address
)
//
检索用户名是否存在
const
checkUserName
=
(
username
)
=>
execu
(
'select count(*) as count from t_user
where username=?'
,
username
)
var
crypto
=
require
(
'crypto'
);
//
引入
crypto
模块
const
register
=
async
(
req
,
res
,
next
)
=>
{
//
得到对应的
id
let
user
=
req
.
body
//
检索当前用户是否已经注册
let
[{
count
}]
=
await
checkUserName
(
user
.
username
)
if
(
count
){
//
当前用户已经注册
res
.
send
(
new
Response
({},
'
当前用户已经注册
'
))
}
else
{
let
md5
=
crypto
.
createHmac
(
'md5'
,
'1234'
);
user
.
password
=
md5
.
update
(
user
.
password
,
'utf8'
).
digest
(
'hex'
);
//hex
转
化为十六进制
//
当前用户未注册
await
saveUser
(
user
)
res
.
send
(
new
Response
(
user
,
'
注册成功
'
))
}
}
通过私钥来生成公钥 (解密)
全局错误处理
app.js
登录实现
jwt
导入
读取对应的密钥的工具类封装
keyUtil.js
dao
层
service
层
openssl genrsa -out rsa_private.key 1024
openssl rsa -in rsa_private.key -pubout -out rsa_public.key
//
全局错误处理
app
.
use
((
err
,
req
,
res
,
next
)
=>
{
//500
错误处理
if
(
err
){
//
利用服务器渲染给一个错误页面
res
.
send
(
'
当前服务器正在维护
'
)
}
else
{
next
()
}
})
const jwt = require('jsonwebtoken'); //
引入
jwt
模块
//
读取对应的公钥和私钥
const fs = require('fs')
const path = require('path')
let privateKey =
fs.readFileSync(path.join(__dirname,'../keys/rsa_private.key')).toString()
let publicKey =
fs.readFileSync(path.join(__dirname,'../keys/rsa_public.key')).toString()
module.exports = {
publicKey,
privateKey,
}
//
检索用户密码
const
queryUserByUsernameAndPassword
=
(
username
,
password
)
=>
execu
(
'select *
from t_user where username=? and password=?'
,
username
,
password
)
const
login
=
async
(
req
,
res
,
next
)
=>
{
//
获取对应的数据
let
{
username
,
password
}
=
req
.
body
//
调用对应的方法进行查询
let
[
user
]
=
await
queryUserByUsernameAndPassword
(
username
,
password
)
//
判断用户是否存在
if
(
user
) {
//
登录成功
//
登录成功返回对应的
token
//token
需要加密 非对称 公钥(通过私钥生成的) 私钥(自己的)
//sign
方法 数据 加密的密钥 对应的配置
const
token
=
jwt
.
sign
({
user
},
privateKey
, {
algorithm
:
'RS256'
,
expiresIn
:
3000
});
res
.
send
(
new
Response
({
token
},
'
登录成功
'
))
}
else
{
res
.
send
(
new
Response
({},
'
用户名或者密码错误
'
))
}
}