挂屏笔记 复习 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:'未知错误'})
 })
86 声望
2 粉丝
0 条评论
推荐阅读
js 将字符串通过下载文件的方式保存到本地
浏览器不允许 JS 执行环境内访问用户电脑上的文件。没有像NodeJS里面的​​fs​​库可以操作文件系统,所以另辟蹊径,通过下载文件的方式,将字符串保存到文件中,下面的小方法出自 [链接]直接调用即可:

小虫_top阅读 153

反编译微信小程序获取小程序前端源码wxapkg
研究反编译的原因就是我自己辛苦了半个月写的小程序,忘记备份放在桌面,心急体验Win11系统 重装系统忘记备份源码,后悔莫及。 后来网上找了反编译的教程,反编译已经上线了的小程序 于是自己尝试了一下,真的可...

TANKING13阅读 10k评论 7

封面图
PDF 预览和下载你是怎么实现的?
在开发过程中要求对 PDF 类型的发票提供 预览 和 下载 功能,PDF 类型文件的来源又包括 H5 移动端 和 PC 端,而针对这两个不同端的处理会有些许不同,下文会有所提及。

熊的猫7阅读 3.8k评论 1

封面图
Just for fun——C#应用和Nodejs通讯
进程通信常见的进程通讯的方法有:管道(Pipe)命名管道信号消息队列其他管道是比较简单基础的技术了,所以看看它。Node IPC支持Node官方文档中Net模块写着:IPC SupportThe net module supports IPC with named ...

pigLoveRabbit3阅读 6.8k评论 2

「过程详解」async await综合题
如果你之前跟我一样一直对async await熟悉又陌生的话(熟悉是可能每天都在用,陌生是针对一些组合题又丈二和尚摸不着头脑),不妨可以边看边练,总结规律,相信会逐渐清晰并有所得。本文对每个案例都详细描述了代...

wuwhs5阅读 1.2k

封面图
cligetter|一款快速生成 Cli工具 开发模版的脚手架
近年来 cli工具 的开发,对于不断发展的前端生态来说,似乎也逐渐成为工程师们的必备技能。其实开发一个 cli工具 并不难,但对于前端的同学可能存在一点认知上的小门槛,特别是对于刚开始接触 cli 脚手架工具开发...

木木剑光3阅读 659

一个灵活的 Node.js 多功能爬虫库 —— x-crawl
x-crawl · x-crawl 是一个灵活的 Node.js 多功能爬虫库。灵活的使用方式和众多的功能可以帮助您快速、安全、稳定地爬取页面、接口以及文件。如果你也喜欢 x-crawl ,可以给 x-crawl 存储库 点个 star 支持一下,...

coderhxl2阅读 1.9k评论 2

封面图
86 声望
2 粉丝
宣传栏