纯 JS 代码实现一个 Nodejs 评论系统
纯 JS 代码实现一个 Nodejs 评论系统
去年多说关闭的时候心血来潮写了一个评论系统了自用。后来觉得维护自己的服务器太麻烦了,所以有心血来潮又重新基于 AWS lamda 重构了. 一百多行 JavaScript 完成了 API.
GitHub: https://github.com/metrue/YoYo
Blog: 打造一个自己的评论系统
内容无法管控就没什么意义了
不错,相比另外那些简洁很多
向你学习下 AWS lambda
发现个角度刁钻的问题… 评论内容是根据页面 url 聚集的, 但如果 url 后面被一些浏览器追加了参数(比如微信的?from=singlemessage), 那么 url 有参数的文章和 url 无参数的文章, 评论区就会形成 2 个"平行宇宙"哈哈
举个栗子:
https://minghe.me/2017-04-18-YoYo:%E8%87%AA%E5%B7%B1%E6%89%93%E9%80%A0%E4%B8%80%E4%B8%AA%E8%AF%84%E8%AE%BA%E6%9C%8D%E5%8A%A1.html
和
https://minghe.me/2017-04-18-YoYo:%E8%87%AA%E5%B7%B1%E6%89%93%E9%80%A0%E4%B8%80%E4%B8%AA%E8%AF%84%E8%AE%BA%E6%9C%8D%E5%8A%A1.html?0=1
只有一个?0=1 的差别, 评论列表就会完全不一样哦~
额 没打完就发出了, 如果 url 里带#footer 这样的锚点, 又会形成平行宇宙.
另外这种方案没有人工审核和验证码, 怎么防止闷声作大死的敏感信息, 怎么防止类似 SQL 注入之类的脚本攻击?
图方便直接使用 YoYo 部署好的。内容存储在 YoYo 的 aws 上。
当然代码是开源,你也可以只部署一套,一个命令而已,所以的东西都在你自己管控下.
对的, 说的很对.
不过确实是一个 bug,找时间修一下的。
bug 已经修复并且部署了。
够快,有些 wordpress 默认没有开启静态化,url 比如 xx.com/?p=123,会不会造成新的困扰? 匿了。。
这要更加需求定制了。或者有什么我还没有想到的方法。
想到个粗暴的办法就是提供 2 个 js 让用户选 1 个用,一个是忽略 url 参数和锚点的,另一个是不忽略的(#锚点的话,因为有些单页应用用锚点做路由,这种情况也不能忽略)
或者 1 个 js 也行,window 对象下放一个布耳值开关,开关为 false 或不存在就怎样,true 就怎样
如果想做可以配置的话,直接把配置附着在 YoYo 的 div 节点即可, 比如类似这样:
<div id=“YoYo” data-yoyo-config-enable-fullpath=“true”></div>
<script src=“https://yoyo-client-production.s3.amazonaws.com/dist/index.js”></script>
完美
嗯,开源产品可能不需要关注这些问题,我说的管控是指的类似为什么多说评论系统关闭了,这些商业化的产品。
实现一个简单的Node.js评论系统需要前后端配合。这里只展示一个基本的后端实现,使用纯JavaScript和Node.js内置的模块(如http和fs)来存储和检索评论。为了简化,评论将存储在一个JSON文件中。
const http = require('http');
const fs = require('fs').promises;
const path = require('path');
const commentsFile = path.join(__dirname, 'comments.json');
http.createServer((req, res) => {
if (req.method === 'POST' && req.url === '/comment') {
let body = '';
req.on('data', chunk => body += chunk.toString());
req.on('end', async () => {
const comment = JSON.parse(body);
const comments = await readComments();
comments.push(comment);
await writeComments(comments);
res.writeHead(201, {'Content-Type': 'application/json'});
res.end(JSON.stringify({message: 'Comment added', comment}));
});
} else if (req.method === 'GET' && req.url === '/comments') {
readComments().then(comments => {
res.writeHead(200, {'Content-Type': 'application/json'});
res.end(JSON.stringify(comments));
}).catch(err => {
res.writeHead(500, {'Content-Type': 'text/plain'});
res.end('Error reading comments');
});
} else {
res.writeHead(404, {'Content-Type': 'text/plain'});
res.end('Not Found');
}
}).listen(3000, () => console.log('Server running on port 3000'));
async function readComments() {
try {
const data = await fs.readFile(commentsFile, 'utf8');
return JSON.parse(data) || [];
} catch (err) {
if (err.code === 'ENOENT') return [];
throw err;
}
}
async function writeComments(comments) {
await fs.writeFile(commentsFile, JSON.stringify(comments, null, 2), 'utf8');
}
这个示例展示了如何创建一个简单的REST API来处理评论的创建和检索。注意,这只是一个基础实现,实际项目中需要添加更多的错误处理、验证和安全措施。


