继上一篇后我打算存储进本地与本地的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的原神账号来测试
请求的图片
点击提交时查看data数据里面有没有传递过去的数据
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的同时,使用异步
去做
说到异步方法就要提到async
和await
了,还有就是我们把https
请求封装为Promise对象
(抛去存储不管)
Promise的返回值
var a = new Promise((resovle,reject)=>{
resovle('成功了')
})
console.log(a)
得到的结果是:
然后你可以参考这篇文章,从中提到
我们接着尝试:
var a = new Promise((resovle,reject)=>{
resovle('成功了')
}).then(res=>{
console.log(res)
})
console.log(a)
得到的结果是:
由此可得出了可以套用promies
的then
来获取
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
所以我们这时候可以想到异步
用异步方法来解决以上问题
异步方法就要提到async
和await
了
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站
按照之前的文档写的前端,也要进行修改了