Debian环境下JS(Node.js)数据存储的常见方法
在Debian系统中,JavaScript(通常通过Node.js运行时)的数据存储需根据数据规模、持久性需求及性能要求选择合适的方式。以下是具体实现方法:
内存存储是将数据保存在Node.js进程的内存中,通过变量或对象实现。这种方式存取速度极快,但进程重启或服务器宕机后数据会丢失,仅适用于临时数据(如缓存、会话信息)。
// 示例:用变量存储计数器 let count = 0; app.get('/increment', (req, res) => { count++; res.send(`Current count: ${count}`); }); 注意:需避免内存泄漏(如未清理的全局变量)。
通过Node.js的fs模块将数据写入文件(如JSON、TXT),适合小规模、非高频写入的数据(如配置信息、日志)。需注意并发写入问题(建议使用异步方法+锁机制)。
const fs = require('fs'); // 写入JSON文件 const data = { name: 'John', age: 30 }; fs.writeFile('data.json', JSON.stringify(data), (err) => { if (err) throw err; console.log('Data saved to file'); }); // 读取JSON文件 fs.readFile('data.json', 'utf8', (err, data) => { if (err) throw err; console.log(JSON.parse(data)); }); 优化:使用fs.promises实现异步操作,或用lowdb库简化JSON文件管理。
适用于复杂查询、事务处理的场景(如用户管理、订单系统),Debian下常用MySQL/MariaDB或PostgreSQL。
sudo apt update && sudo apt install mysql-serversudo mysql_secure_installation设置root密码,修改/etc/mysql/mysql.conf.d/mysqld.cnf调整绑定地址(如bind-address = 0.0.0.0允许远程访问)。mysql2库(支持Promise)。const mysql = require('mysql2/promise'); async function query() { const connection = await mysql.createConnection({ host: 'localhost', user: 'root', password: 'password', database: 'test' }); const [rows] = await connection.execute('SELECT * FROM users'); console.log(rows); await connection.end(); } query(); sudo apt update && sudo apt install postgresql postgresql-contrib/etc/postgresql/<version>/main/postgresql.conf设置listen_addresses = '*',编辑pg_hba.conf允许远程访问(如host all all 0.0.0.0/0 md5)。pg库。const { Client } = require('pg'); async function query() { const client = new Client({ user: 'postgres', password: 'password', database: 'test', host: 'localhost' }); await client.connect(); const res = await client.query('SELECT * FROM users'); console.log(res.rows); await client.end(); } query(); 备份:使用mysqldump(MySQL)或pg_dump(PostgreSQL)定期备份数据库。
适合高并发、海量数据场景(如实时聊天、物联网数据),Debian下常用MongoDB(文档型)或Redis(键值型)。
sudo apt update && sudo apt install mongodbmongoose库(提供Schema验证)。const mongoose = require('mongoose'); mongoose.connect('mongodb://localhost:27017/test', { useNewUrlParser: true, useUnifiedTopology: true }); const userSchema = new mongoose.Schema({ name: String, age: Number }); const User = mongoose.model('User', userSchema); async function saveUser() { const user = new User({ name: 'Alice', age: 25 }); await user.save(); console.log('User saved'); } saveUser(); sudo apt update && sudo apt install redis-serverioredis库(支持集群)。const Redis = require('ioredis'); const redis = new Redis(); async function setValue() { await redis.set('key', 'value'); const value = await redis.get('key'); console.log(value); // 'value' } setValue(); 备份:MongoDB通过mongodump备份,Redis通过BGSAVE命令或redis-cli save手动保存。
日志是排查问题的关键,Debian下可通过以下方式存储JS应用日志:
支持多传输方式(文件、控制台、数据库),配置日志级别(info、error)和轮转(避免文件过大)。
const winston = require('winston'); const logger = winston.createLogger({ level: 'info', format: winston.format.json(), transports: [ new winston.transports.File({ filename: '/var/log/app.log' }), new winston.transports.Console() ] }); logger.info('Application started'); 通过logrotate工具自动分割、压缩日志文件,防止占用过多磁盘空间。创建/etc/logrotate.d/app配置文件:
/var/log/app.log { daily rotate 7 compress missingok notifempty create 640 root adm } 说明:daily表示每日轮转,rotate 7保留7天日志,compress压缩旧日志。