挂屏笔记 复习 node.js 接口跨域配置,连接数据库,身份认证

cors实现跨域配置

安装 cors 后可通过引人中间件的方式引入到代码中

npm install cors 
const cors=require("cors")

要在调用路由之前

app.use('URL前缀',cors())

自定义响应头实现跨域配置

CORS 响应头 Access-Control-Allow-Origin 允许访问的地址

res.setHeader('Access-Control-Allow-Origin','允许跨域访问的 URL,可以写通配符*')

CORS 响应头 Access-Control-Allow-Methods 默认仅支持 GET,PODST,HEAD 请求

res.setHeader('Access-Control-Allow-Methods','*')

nodejs连结,操作数据库

安装,引入mysql的包

npm install MySQL
const mysql = require('mysql')

建立连结

const db = mysql.createPool({
 host:"127.0.0.1",
 user:"root",
 password:"admin123",
 databases:"mydatabases"
})

执行sql

let SQL_str='select * from user'
db.query('SQL_str',(err,results)=>{
 if(err) return console.log(err.message)
 查询操作执行成功后结果集存储到 results 中
 console.log(results)
}) 

执行有参数的 sql

db.query('SQL str',['SQL_str中需要的参数','字符串中用?占位'],(err,results)=>{
 if(err) return console.log(err.message)
 // 如果是增删改操作,则 results.affectedRows 为受影响的行数
 console.log(results)
}) 

如果数据对象的每个属性和数据表的字段一一对应,可以使用便捷写法

// 插入
let user1={name:'zhangsan',age:18}
const sqlStr1='Insert into user_table SET ?'
db.query(sqlStr1,user1,(err,results)=>{
 console.log(results)
})
// 更新
let user2={name:'zhangsan',age:18}
const sqlStr2='UPDATE user_table SET ? where id=?'
db.query(sqlStr2,[user2,user2.id],(err,results)=>{
 console.log(results)
})

session 认证

依赖Cookie 面对跨域请求具有局限性
安装 导入 配置 session 中间件

npm install express-session
var session=require('express-session')
//注册为全局可用
app.use(session({
 secret:'keyboard cat' // secret 属性的值可以为任意字符串
 resave:false, // 固定写法
 saveUninitialized:true // 固定写法
}))

配置成功后可通过 req.session 来访问和使用 session 对象,比如这里用于登陆和获取用户名字的两个接口

app.post('/api/login',(req,res)=>{
 // 判断用户提交的登录信息是否正确
 if(req.body.username!='admin' || req.body.password!='000000'){
 return res.send({status:1,msg:'登陆失败'})
 }
 req.session.user=req.body //将用户信息存储到session中
 req.session.islogin=true //将用户的登陆状态存储到session中
 res.send({status:0,msg:'登陆成功'})
})
app.get('/api/username',(req,res)=>{
 //判断用户是否登录
 if(!req.session.islogin){
 return res.send({status:1,msg:'fail'})
 }
 res.send({status:0,msg:'success',username:req.session.user.username})
})

req.session.destroy() 可以清空session,例如用户退出登陆时

app.post('api/logout',(req,res)=>{
 req.session.destroy()
 res.send({status:0,msg:'退出成功'})
})

jwt 认证

摆脱了cookie 的跨域局限性,最流行的认证方式
jwt token 的三个组成部分:Header(头部),Payload(载荷),Signature(签名)
客户端接收到服务器返回的 jwt 之后 通常会将它存储在 localStorage 或 sessionStorage 中
此后,客户端每次与服务器通信,都要带上这个jwt 的字符串,从而进行省份认证,推荐的做法是把jwt放在
http 请求头的 Authorization 字段中,格式如下:
Authorization:Bearer <token>

安装,导入 jwt 相关的包
jsonwebtoken:用于生成jwt字符串
express-jwt:用于将jwt字符串解析还原成json对象

npm install jsonwebtoken express-jwt 
const jwt=require('jsonwebtoken')
const expressJWT=REQUIRE('express-jwt')

定义sescret 密钥(盐)

const secretKey='hello'

生成 jwt 字符串并响应给客户端

// 参数1:用户信息对象,不要包含密码之类的敏感数据
// 参数2:加密的密钥
// 参数3:配置对象,示例为token有效时间
const tokenStr=jwt.sign(
 {username:'张三'},
 secretKey,
 {expiresIn:'30s'}
)
res.send({status:200,message:'登陆成功',toen:tokenStr})

解析token,并通过unless指定哪些接口不需要访问权限
解析出来的用户信息挂在到 req.user属性上
解析错误的情况需要错误中间件配合处理

 app.use(expressJWT({secret:secretKey}).unless({path:[/^\/api\//]}))
 app.use((err,req,res,next)=>{
 if(err.name="UnauthorizedError"){
 retrun res.send({status:401,message:'无效token'})
 }
 res.send({status:500,message:'未知错误'})
 })
作者:小虫_top原文地址:https://segmentfault.com/a/1190000043583365

%s 个评论

要回复文章请先登录注册