挂屏笔记 复习 node.js 接口跨域配置,连接数据库,身份认证
小虫_top小虫_top -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:'未知错误'})
})