如何用JavaScript在服务器实现文本文件读写(替代SQL存储点名数据)
当然可以!用文本文件存储少量数据完全可行
首先给你吃个定心丸:完全可以用文本文件来存储少量数字数据,这种轻量级方案特别适合你不想折腾数据库的场景——我之前也帮不少开发者处理过类似的轻量存储需求,在服务器上跑起来一点问题都没有,和你在C++ IDE里测试的逻辑本质是一样的,只是换了JavaScript(服务器端用Node.js)来实现而已。
下面给你一步步拆解如何实现点名程序和hr.txt的读写交互:
核心思路
因为前端的HTML页面(点名程序)不能直接读写服务器上的文件,所以需要用Node.js搭建一个简单的后端服务,通过HTTP接口来处理文件的读写操作,前端再调用这些接口来完成数据的存储和读取。
第一步:服务器端实现文件读写(Node.js)
Node.js自带的fs模块就能搞定文件操作,下面是具体代码示例:
1. 写入数字到hr.txt
const fs = require('fs'); const path = require('path'); // 封装写入函数 function writeToHrFile(number) { // 确保文件路径正确(这里假设hr.txt和脚本在同一目录) const filePath = path.join(__dirname, 'hr.txt'); // 把数字转成字符串写入,用异步方法避免阻塞服务器 fs.writeFile(filePath, number.toString(), (err) => { if (err) { console.error('写入文件出错啦:', err); return; } console.log('数字成功写入hr.txt'); }); } // 测试调用:比如写入数字15 // writeToHrFile(15);
2. 从hr.txt读取数字
// 封装读取函数 function readFromHrFile(callback) { const filePath = path.join(__dirname, 'hr.txt'); fs.readFile(filePath, 'utf8', (err, data) => { if (err) { // 处理文件不存在的情况(比如第一次运行时),返回默认值0 if (err.code === 'ENOENT') { console.log('hr.txt还没创建,返回默认值0'); callback(null, 0); return; } console.error('读取文件出错:', err); callback(err, null); return; } // 把读取到的字符串转成数字,还要校验有效性 const number = parseInt(data, 10); if (isNaN(number)) { callback(new Error('hr.txt里的内容不是有效数字'), null); return; } callback(null, number); }); } // 测试调用 // readFromHrFile((err, number) => { // if (err) { // console.error('读取失败:', err); // return; // } // console.log('读取到的数字:', number); // });
第二步:搭建HTTP接口,让前端能调用
用Express框架快速搭建接口(先通过npm install express安装依赖):
const express = require('express'); const app = express(); const port = 3000; // 可以自己改端口 // 解析前端发来的JSON数据 app.use(express.json()); // 托管静态文件:让前端的点名程序能被访问到 app.use(express.static(__dirname)); // 写入数字的接口(前端POST请求) app.post('/save-number', (req, res) => { const { number } = req.body; // 校验前端传来的是不是有效数字 if (typeof number !== 'number' || isNaN(number)) { return res.status(400).send('请传入有效的数字哦'); } writeToHrFile(number); res.send('数字已成功保存!'); }); // 读取数字的接口(前端GET请求) app.get('/load-number', (req, res) => { readFromHrFile((err, number) => { if (err) { return res.status(500).send('读取数据失败了'); } res.json({ number }); }); }); // 启动服务器 app.listen(port, () => { console.log(`服务器跑起来啦!访问 http://localhost:${port}/roll call program.htm 就能打开点名程序`); });
第三步:前端点名程序里调用接口
在你的roll call program.htm里添加JavaScript代码,通过fetch调用后端接口:
保存数字到服务器
// 比如点击某个按钮时保存数字 async function saveNumber(number) { try { const response = await fetch('/save-number', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ number }), }); const message = await response.text(); alert(message); // 提示用户保存成功 } catch (error) { console.error('保存失败:', error); alert('保存出错了,请稍后再试'); } }
从服务器读取数字
// 页面加载时读取数字 async function loadNumber() { try { const response = await fetch('/load-number'); const data = await response.json(); return data.number; // 返回读取到的数字,你可以用它更新页面内容 } catch (error) { console.error('读取失败:', error); return 0; // 读取失败时返回默认值 } } // 页面加载完成后执行 window.addEventListener('load', async () => { const savedNumber = await loadNumber(); console.log('从服务器读取到的数字:', savedNumber); // 这里可以把数字显示在页面上,比如 document.getElementById('number-display').textContent = savedNumber; });
服务器部署注意事项
- 环境支持:确保你的服务器安装了Node.js(大部分云服务器、VPS都支持,安装步骤很简单);
- 文件权限:要保证Node.js进程有读写
hr.txt所在目录的权限,不然会出现读写失败的错误; - 并发问题:如果你的点名程序同时有很多人使用,可能会出现并发写文件导致数据覆盖的情况——不过如果是小范围使用(比如班级点名),这个概率很低,真遇到的话可以加个简单的文件锁或者用
fs.promises.writeFile结合异步控制来处理; - 数据备份:文本文件不像数据库有自动备份,记得定期手动备份
hr.txt,避免数据丢失。
总的来说,这个方案完全能满足你的需求,轻便又不用碰SQL,上手也快!
内容的提问来源于stack exchange,提问作者user11613775




