Node.js在Linux上的数据存储方式
文件系统是Node.js最基础的数据存储方式,通过内置的fs模块实现文件的读写、追加、删除等操作,适合存储配置文件、日志、静态资源等非结构化或小规模数据。
fs.writeFile('data.json', JSON.stringify({name: 'John'}), (err) => err ? console.error(err) : console.log('写入成功'));fs.readFile('data.json', 'utf8', (err, data) => err ? console.error(err) : console.log('文件内容:', data));fs.appendFile('log.txt', \n${new Date()}: 新日志, (err) => err && console.error(err));fs.unlink('temp.txt', (err) => err && console.error(err));fs.writeFileSync)会阻塞,仅在初始化等场景使用。proper-lockfile库)避免数据覆盖。关系型数据库适合存储结构化数据(如用户信息、订单数据),支持复杂的SQL查询和事务处理。Linux环境下常用MySQL(流行度高)或PostgreSQL(标准兼容性好)。
sudo yum install mysql-server -y && sudo systemctl start mysqld && sudo systemctl enable mysqld。CREATE DATABASE mydb; USE mydb; CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50), age INT);。npm install mysql2(比mysql更高效)。const mysql = require('mysql2/promise');
async function main() {
const connection = await mysql.createConnection({host: 'localhost', user: 'root', password: '123456', database: 'mydb'});
await connection.execute('INSERT INTO users (name, age) VALUES (?, ?)', ['Alice', 25]);
const [rows] = await connection.execute('SELECT * FROM users WHERE name = ?', ['Alice']);
console.log(rows); // 输出查询结果
await connection.end();
}
main().catch(console.error);
sudo yum install postgresql-server postgresql-contrib -y && sudo postgresql-setup --initdb --unit postgresql && sudo systemctl start postgresql && sudo systemctl enable postgresql。postgres用户,执行createdb mydb && psql mydb -c "CREATE TABLE products (id SERIAL PRIMARY KEY, name VARCHAR(100), price DECIMAL(10,2));"。npm install pg。const { Client } = require('pg');
async function main() {
const client = new Client({user: 'postgres', password: '123456', host: 'localhost', database: 'mydb'});
await client.connect();
await client.query('INSERT INTO products (name, price) VALUES ($1, $2)', ['Laptop', 999.99]);
const res = await client.query('SELECT * FROM products WHERE name = $1', ['Laptop']);
console.log(res.rows); // 输出查询结果
await client.end();
}
main().catch(console.error);
?或$1)防止SQL注入。mysqldump或pg_dump)。MongoDB是非关系型数据库,适合存储半结构化/非结构化数据(如JSON文档、日志、用户行为数据),无需预定义表结构,扩展性强。
cat << EOF | sudo tee /etc/yum.repos.d/mongodb-org.repo\n[mongodb-org-6.0]\nname=MongoDB Repository\nbaseurl=https://repo.mongodb.org/yum/redhat/\$releasever/mongodb-org/6.0/x86_64/\ngpgcheck=1\nenabled=1\ngpgkey=https://www.mongodb.org/static/pgp/server-6.0.asc\nEOF。sudo yum install -y mongodb-org && sudo systemctl start mongod && sudo systemctl enable mongod。npm install mongodb。const { MongoClient } = require('mongodb');
async function main() {
const client = new MongoClient('mongodb://localhost:27017', {useNewUrlParser: true, useUnifiedTopology: true});
await client.connect();
const db = client.db('mydb');
const collection = db.collection('tasks');
// 插入文档
await collection.insertOne({title: 'Learn Node.js', completed: false});
// 查询文档
const task = await collection.findOne({title: 'Learn Node.js'});
console.log(task); // 输出查询结果
await client.close();
}
main().catch(console.error);
27017端口,生产环境需配置认证(如--auth参数)和绑定IP(如--bind_ip_all)。Redis是内存数据库,适合存储临时数据(如会话信息、热点数据、计数器),读写速度快(微秒级响应),支持多种数据结构(字符串、哈希、列表等)。
sudo yum install redis -y && sudo systemctl start redis && sudo systemctl enable redis。npm install redis。const redis = require('redis');
const client = redis.createClient();
client.on('error', (err) => console.error('Redis错误:', err));
client.connect().then(() => {
// 设置键值对(过期时间1小时)
client.set('session:123', 'user_token_abc', {EX: 3600});
// 获取键值对
client.get('session:123').then((value) => console.log('Session:', value));
// 存储哈希(用户信息)
client.hSet('user:1', 'name', 'Alice', 'age', 25);
client.hGetAll('user:1').then((user) => console.log('User:', user));
}).catch(console.error);
RDB/AOF持久化配置解决)。ioredis库支持集群)。日志是应用运行的重要记录,可用于排查问题、审计等,Linux环境下可通过以下方式存储:
fs模块将日志追加到文件(如logs/app.log),适合简单场景。const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transports.File({filename: 'logs/error.log', level: 'error'}),
new winston.transports.File({filename: 'logs/combined.log'}),
],
});
logger.info('This is an info log');
logger.error('This is an error log');
pino-syslog等库将日志发送到系统日志(如local0设施),适合集中管理。