将api中获得数据存放到自己的数据中

继上一篇后我打算存储进本地与本地的MySQL数据库中(用nodejs)

我们使用的是node中的fs模块来存储还要进行模块化设计

目前为止是通过uid来进行主要的逻辑

创建数据库和表

#创建数据库
CREATE DATABASE node_mysql;

USE `node_mysql`;

#如果表存在则删除
DROP TABLE IF EXISTS `bilibiliUserInfo_data`;
#目前的逻辑,按需修改(因为mid不是我们定的所以不是自增,但唯一可以确定的是,不能重复)
CREATE TABLE `bilibiliUserInfo_data`(`mid` INT NOT NULL UNIQUE PRIMARY KEY,
`name` VARCHAR(255) NOT NULL,
`sex` VARCHAR(25) NOT NULL,
`face` VARCHAR(255) NOT NULL
);

INSERT INTO `bilibiliUserInfo_data` VALUES(1,'admin','男','https://..');#测试添加

SELECT * FROM `bilibiliUserInfo_data`;

DELETE FROM `bilibiliUserInfo_data`;

后端(nodejs)的模块化代码(耦合度高一点)

linkMySql.js(链接数据库)

const mysql = require('mysql')


var connection = mysql.createConnection({
    host: '主机地址',//端口默认是3306
    user: 'root',//用户名
    password: '密码',
    database: 'node_mysql'//链接数据库,按自己的数据库来
});

connection.connect();

//这只是测试是否可以访问
connection.query('select * from bilibiliUserInfo_data',function(error, results, fields){
    if(error) throw error
    console.log('The solution is: ', results);
})

//暴露connection模块
module.exports = {
    connection
}

getUserInfo.js(目前的https请求,fs存放)(主要逻辑)

const https = require('https')
const http = require('http')

const fs = require('fs')

const express = require('express')
const app = express()

//导入并解构linkMySql.js
const {connection} = require('./linkMySql')

function getUserInfo(uid){
    https.get(`https://api.bilibili.com/x/space/acc/info?mid=${uid}&jsonp=jsonp`,(res)=>{
        let data = ''
        res.on('data',(chunk)=>{
            data += chunk
        })
        res.on('end',()=>{
            // console.log(JSON.parse(data))

            console.log(JSON.parse(data))
            
            fileSave(data)
            
			//获取到传递过来的uid作为uri去创建地址
            app.get(`/${uid}`,(req,res)=>{
                console.log(`/${uid} 响应了`)
                res.send(JSON.parse(data))
            })
        })
    }).on('error',(err)=>{
        console.log("Erorr:",err.message)
    })

}

function fileSave(data){
    var da1 = JSON.parse(data)
    fs.stat(`./userInfo/${da1.data.mid}.txt`,function (err,stat){
        if(stat&&stat.isFile()){
            //文件存在
            fs.readFile(`./userInfo/${da1.data.mid}.txt`,(err,data)=>{
                if(err) throw err
                console.log(data)
                // console.log(data.toString())
                // console.log(JSON.parse(data.toString()))
                var da = JSON.parse(data.toString())//buffer转数组后转json格式数据
                // console.log(da.data.name)//陈天羽----OK
                console.log(da.data)
            })
        }else{
            //文件不存在
            // const data1 = new Uint8Array(Buffer.from(JSON.parse(data)))
            fs.writeFile(`./userInfo/${da1.data.mid}.txt`/*动态获取mid来创建txt文本*/,data,(err)=>{
                if(err) throw err
                console.log('写入完成')
                insertMysql_bilibiliUserInfo_data(da1.data.mid,da1.data.name,da1.data.sex,da1.data.face)
            })
        }
    })
}

//mysql的四个值(按自己需求)
function insertMysql_bilibiliUserInfo_data(mid,name,sex,face){
    var insertOne = "insert into bilibiliUserInfo_data values(?,?,?,?)"
    var addInsertOne = [mid,name,sex,face]
    connection.query(insertOne,addInsertOne,function (err, result) {
        if(err){
        console.log('[INSERT ERROR] - ',err.message);
        return;
        }        

        console.log('--------------------------INSERT----------------------------');
        //console.log('INSERT ID:',result.insertId);        
        console.log('INSERT ID:',result);        
        console.log('-----------------------------------------------------------------\n\n');  
    })
}

module.exports = {
    getUserInfo,
    fileSave,
    insertMysql_bilibiliUserInfo_data
}

mian.js(主要程序,程序入口)

const express = require('express')

const app = express()

const cors = require('cors')
app.use(cors(

))

const fs = require('fs')
const buffer = require('node:buffer')

const http = require('http')
const https = require('https')

//导入getUserInfo.js,并解构暴露的方法
const {getUserInfo,fileSave,insertMysql_bilibiliUserInfo_data} = require('./getUserInfo')

app.get('/filesave',(req,res)=>{
	//获取请求的数据
    res.send(req.query)
    //查看数据,并为下面的赋值做准备
    console.log(req.query)
    //getUserInfo.js中的getUserInfo方法,传递uid
    getUserInfo(req.query.mid)
})




app.get('/hello',(req,res)=>{
    res.send("hello Vue")
})

app.listen(5000,()=>{
    console.log('5000端口已经监视')
})

前端的请求

还是vite + vue3 + typescript

import {ref} from 'vue';
let uid = ref<number>()
function submitUid(){
	//get请求数据的一种方式
  axios.get(`/myInter/filesave?mid=${uid.value}`).then(res=>{
    console.log(res)
  }).catch(err=>{
    console.log(err)
  })
}
import {ref} from 'vue';
let uid = ref<number>()
function submitUid(){
	//post请求数据的一种方式
  axios.post(`/myInter/filesave?mid`,{
	data:{
		mid: uid.value
	}
  }).then(res=>{
    console.log(res)
  }).catch(err=>{
    console.log(err)
  })
}

我们要的是get请求,其余的方式可以去找网上大佬的文章

<template>
  <div>
  <!--v-model:双向数据绑定,input输入类的用的最多-->
    <input name="uid" placeholder="查询添加的B站uid" v-model="uid"/>
    <input type="submit" value="提交" @click="submitUid()"/>
  </div>
</template>

我们就找bilibili的原神账号来测试
bilibili原神账号截图
请求的图片请求的图片没有css美化
点击提交时查看data数据里面有没有传递过去的数据
点击提交时查看data数据里面有没有传递过去的数据
nodejs后端响应的数据
nodejs后端响应的数据
能看到成功拿到了数据并保存到了自己的数据库中

SELECT * FROM `bilibiliUserInfo_data`;

就能查看到数据库中的数据

再次提交数据,后端则会看到
在这里插入图片描述
设计的只有文件不存在的时候,才会写入数据库,其他都是读取数据

添加axiosFun3()方法(查看)(关键就是你的uid必须要存在)

function axiosFun3(uid:string){
  axios.get(`/myInter/${uid}`).then(res=>{
    console.log(res)
    userInfo.mid = res.data.data.mid
    userInfo.name = res.data.data.name
    userInfo.sex = res.data.data.sex
    userInfo.face = res.data.data.face
  }).catch(err=>{
    console.log("Error:",err)
  })
}
<button @click="axiosFun3(uid)">点击获取自己的服务器数据2</button>
  <p>mid: {{userInfo.mid}}</p>
  <p>昵称: {{userInfo.name}}</p>
  <p>性别:{{userInfo.sex}}</p>
  <!--按照我的访问,img会403报错(亲测,没有权限访问)-->
  <img :src="userInfo.face" alt="用户头像" />

vite.config.ts:

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [vue()],
  server:{
    proxy:{
      "/api":{
        target: "https://api.bilibili.com/x",
        changeOrigin:true,
        // /api/relation/stat?vmid=13805897&jsonp=jsonp ===  https://api.bilibili.com/x/relation/stat?vmid=13805897&jsonp=jsonp
        rewrite: (path)=> path.replace(/^\/api/,"")
      },
      "/myInter":{
        target: "http://localhost:5000",
        changeOrigin:true,
        // /api/relation/stat?vmid=13805897&jsonp=jsonp ===  https://api.bilibili.com/x/relation/stat?vmid=13805897&jsonp=jsonp
        rewrite: (path)=> path.replace(/^\/myInter/,"")
      }
    }
  }
})

会有bug: 你获取不到值,虽然你传递了参数,但是无济于事(重点)

所以我嵌套的get的同时,使用异步去做
说到异步方法就要提到asyncawait了,还有就是我们把https请求封装为Promise对象(抛去存储不管)

Promise的返回值

var a = new Promise((resovle,reject)=>{
    resovle('成功了')
})
console.log(a)

得到的结果是:
node promiesTest.js

然后你可以参考这篇文章,从中提到
文章的promies的then描述

我们接着尝试:

var a = new Promise((resovle,reject)=>{
    resovle('成功了')
}).then(res=>{
    console.log(res)
})
console.log(a)

得到的结果是:
node promiesTest.js(加了then)

由此可得出了可以套用promiesthen来获取

function getUserInfo(uid){
    var dataMsg;
    var dataMsg1 = new Promise((resolve,reject)=>{
        https.get(`https://api.bilibili.com/x/space/acc/info?mid=${uid}&jsonp=jsonp`,(res)=>{
            let data = ''
            res.on('data',(chunk)=>{
                data += chunk
            })
            res.on('end',()=>{
                console.log(JSON.parse(data))
                // console.log('dataMsg:',dataMsg)//var dataMsg = "我";  :我
                resolve(data)
                
            })
        }).on('error',(err)=>{
            console.log("Erorr:",err.message)
            reject(err.message)
        })
    }).then(res=>{
        console.log('promise then-res:',res)
        dataMsg = JSON.parse(res)
    })
    console.log('dataMsg:',dataMsg)
    return dataMsg
}

虽然可以得到数据,但是显示的还是dataMsg:undefined所以我们这时候可以想到异步

用异步方法来解决以上问题

异步方法就要提到asyncawait

async function getUserInfo(uid){
    var dataMsg;
    var dataMsg1 = await new Promise((resolve,reject)=>{
        https.get(`https://api.bilibili.com/x/space/acc/info?mid=${uid}&jsonp=jsonp`,(res)=>{
            let data = ''
            res.on('data',(chunk)=>{
                data += chunk
            })
            res.on('end',()=>{
                console.log(JSON.parse(data))
                // console.log('dataMsg:',dataMsg)//var dataMsg = "我";  :我
                resolve(data)
                
            })
        }).on('error',(err)=>{
            console.log("Erorr:",err.message)
            reject(err.message)
        })
    }).then(res=>{
        console.log('promise then-res:',res)
        dataMsg = JSON.parse(res)
    })
    console.log('dataMsg:',dataMsg)
    return dataMsg
}

这样我们就只要请求一个get请求就可以获取到值了(为什么使用get,是因为在公开安全的数据中get是安全的(不会轻易改变数据库的值),但是涉及到隐私就要使用post请求了)

const express = require('express')

const app = express()

const cors = require('cors')
app.use(cors(

))

const fs = require('fs')
const buffer = require('node:buffer')

const http = require('http')
const https = require('https')


const {getUserInfo,fileSave,insertMysql_bilibiliUserInfo_data} = require('./getUserInfo')

app.get('/filesave',async(req,res)=>{
    //req.query.mid:获取传递过来的数据
    // console.log(req.query)
  //这里也要使用异步,注意方法前那个async(异步方法)
    var a = await getUserInfo(req.query.mid)
    console.log('a:',a)
    res.send(a)
})

//测试get请求
app.get('/hello',(req,res)=>{
    res.send("hello Vue")
})

app.listen(5000,()=>{
    console.log('5000端口已经监视')
})

http://localhost:5000/filesave?mid=b站uid就可以请求到了自己服务器去请求B站花玲的信息(地址是自己的服务器地址)
注意:https默认端口号是443可以https://www.bilibili.com:443/去访问B站

按照之前的文档写的前端,也要进行修改了

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

结城明日奈是我老婆

支持一下一直热爱程序的菜鸟吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值