You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用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;
});

服务器部署注意事项

  1. 环境支持:确保你的服务器安装了Node.js(大部分云服务器、VPS都支持,安装步骤很简单);
  2. 文件权限:要保证Node.js进程有读写hr.txt所在目录的权限,不然会出现读写失败的错误;
  3. 并发问题:如果你的点名程序同时有很多人使用,可能会出现并发写文件导致数据覆盖的情况——不过如果是小范围使用(比如班级点名),这个概率很低,真遇到的话可以加个简单的文件锁或者用fs.promises.writeFile结合异步控制来处理;
  4. 数据备份:文本文件不像数据库有自动备份,记得定期手动备份hr.txt,避免数据丢失。

总的来说,这个方案完全能满足你的需求,轻便又不用碰SQL,上手也快!

内容的提问来源于stack exchange,提问作者user11613775

火山引擎 最新活动