当前位置: 首页 > 后端技术 > Node.js

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

时间:2023-04-03 20:14:53 Node.js

Cors实现跨域配置。安装cors后,可以通过引入中间件的方式引入到代码中。npminstallcorsconstcors=require("cors")必须在调用路由前app.use('URLprefix',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包npminstallMySQLconstmysql=require('mysql')建立连接constdb=mysql.createPool({host:"127.0.0.1",user:"root",password:"admin123",databases:"mydatabases"})执行sqlletSQL_str='select*fromuser'db.query('SQL_str',(err,results)=>{if(err)returnconsole.log(err.message)查询操作执行成功后,结果集存入resultsconsole.log(results)})执行sqldb.querywithparameters('SQLstr',['SQL_str中需要的参数','在字符串中使用?placeholder'],(err,results)=>{if(err)returnconsole.log(err.message)//如果是增删改操作,results.affectedRows是受影响的行数console.log(results)})如果数据是对象的每个属性一一对应数据表的字段,可以使用方便的写法//insertletuser1={name:'zhangsan',age:18}constsqlStr1='Insertintouser_tableSET?'db.query(sqlStr1,user1,(err,results)=>{console.log(results)})//updateletuser2={name:'zhangsan',age:18}constsqlStr2='UPDATEuser_tableSET?whereid=?'db.query(sqlStr2,[user2,user2.id],(err,results)=>{console.log(results)})session认证依赖cookies,面对跨域有局限性requestsInstallimportconfigurationsessionmiddlewarenpminstallexpress-sessionvarsession=require('express-session')//注册为全局可用app.use(session({secret:'keyboardcat'//secret属性的值可以是anystringresave:false,//固定写法saveUninitialized:true//固定写法}))配置成功后,可以通过req.session访问和使用session对象,比如用于登录和获取用户的两个接口nameshereapp.post('/api/login',(req,res)=>{//判断用户提交的登录信息是否正确if(req.body.username!='admin'||req.body.password!='000000'){returnres.send({status:1,msg:'登录失败'})}req.session.user=req.body//在session中存储用户信息req.session.islogin=true//在sessionres中存储用户的登录状态。发送({状态:0,msg:'登录成功'})})app.get('/api/username',(req,res)=>{//判断用户是否登录if(!req.session.islogin){returnres.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的跨域限制。最流行的认证方式是jwttoken的三个组成部分:Header(头部)、Payload(负载)、Signature(签名)。客户端收到服务端返回的jwt后,一般存放在localStorage或者sessionStorage中。之后每次client和server通信,都要带上省认证的jwt字符串。推荐的方法是将jwt放在http请求头的Authorization字段中,格式如下:Authorization:Bearerinstallation,importjwt相关包jsonwebtoken:用于生成jwt字符串express-jwt:用于解析并将jwt字符串恢复为json对象npminstalljsonwebtokenexpress-jwtconstjwt=require('jsonwebtoken')constexpressJWT=REQUIRE('express-jwt')定义sescretkey(salt)constsecretKey='hello'生成一个jwt字符串并响应给客户端//参数1:用户信息对象,不包含密码等敏感数据//参数2:加密密钥//参数3:配置对象,例如token有效时间consttokenStr=jwt.sign({用户名e:'张三'},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"){重新运行res.send({status:401,message:'invalidtoken'})}res.send({status:500,message:'未知错误'})})