前言

注意:只有后端,没有前端!主要是发一下代码供参考学习,并不是一个完整的教程。

我的博客总体来说速度还算是比较快的,但是使用vercel部署的说说严重影响了速度。
于是继twikoo之后我决定也把说说挪到服务器上面。
本人会一些node相关的知识,且写一个简单的增查也不是很难,所以就决定自己试试看,纯当练手了。

既然你能看到这篇文章那就说明我写出来了,总共花了几个小时的时间,百度、迁移数据、适配前端等占据大部分。
功能很少,只有添加和查询,后期可能会再添加,不过我个人感觉已经完全够用,毕竟说说主要就是展示数据而已。其他的可以直接修改data.json文件(我更喜欢这种)。

代码

部署可以参考这篇文章,基本都是一样的原理:微博热搜api使用与自建

package.json

1
2
3
4
5
6
7
8
9
10
11
{
"name": "talk",
"main": "index.js",
"scripts": {
"build": "node index.js"
},
"license": "ISC",
"dependencies": {
"express": "^4.18.1"
}
}

data.json(数据库)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"nickName": "Leonus", // 昵称
"avatar": "https://q1.qlogo.cn/g?b=qq&nk=553344777&s=3", // 头像
"talkList": [{
"content": "说说内容",
"date": "2022-06-28T13:13:30.65Z", // 时间
"device": "大师探索版", // 设备
"tag": "随便写写", // 标签
"link": {
"linkName": "", // 链接内容
"linkUrl": "" // 链接地址
}
}],
"total": 1 // 总数
}

index.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
// 导包
const express = require('express');
const fs = require('fs');

const app = express()
app.use(express.json())

// 允许跨域(百度的)
app.all('*', function(req, res, next) {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Headers', 'Content-Type');
res.header('Access-Control-Allow-Methods', '*');
res.header('Content-Type', 'application/json;charset=utf-8');
next();
});

// 添加说说 post请求
app.post('/addTalk', (req, res) => {
if(req.body.token != "xxxxxxxx") res.status(500).send("token错误"); // 简单的做一下验证,我对安全等等不是很懂
let d = addTalk(req.body)
res.send({
message: "请求成功",
data: d
})
})

// 获取说说 get请求
app.get('/getTalk', (req, res) => {
let d = getTalk(req.query.length);
res.send(d)
})


function addTalk(tmp) {
let data = JSON.parse(fs.readFileSync('./data.json', 'utf8')) // 读取文件
let newTalk = { // 处理数据
"date": new Date(),
"content": tmp.content ? tmp.content : "",
"device": tmp.device ? tmp.device : "",
"link": {
linkName: tmp.link.linkName ? tmp.link.linkName : "",
linkUrl: tmp.link.linkUrl ? tmp.link.linkUrl : ""
},
"tag": tmp.tag ? tmp.tag : ""
}
data.talkList.push(newTalk) // 增加内容
data.total = data.talkList.length // 修改total
fs.writeFileSync('./data.json', JSON.stringify(data), 'utf8') // 写入文件
return newTalk
}

// 参数为获取的长度
function getTalk(length) {
let data = JSON.parse(fs.readFileSync('./data.json', 'utf8'))
if (length <= data.total) {
data.talkList = data.talkList.reverse().slice(0, length)
}
return data
}

// 捕获异常
app.use((err, req, res, next) => {
res.status(500).send(err.message);
})

// 监听端口
app.listen(3456)

后记

如果你有什么好的建议,欢迎留言。