node_day04

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 ({}, ' 用户名或者密码错误 ' ))
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值