使用Node.js构建基于YugabyteDB的应用程序教程
前言
YugabyteDB是一个高性能、云原生的分布式SQL数据库,兼容PostgreSQL协议。本文将详细介绍如何使用Node.js构建一个简单的应用程序来连接和操作YugabyteDB集群。
环境准备
在开始之前,请确保您已安装以下软件:
- Node.js最新稳定版本
- npm包管理器(通常随Node.js一起安装)
项目初始化
首先创建一个新的Node.js项目目录并初始化:
mkdir yugabyte-node-app && cd yugabyte-node-app
npm init -y
安装依赖
我们需要安装两个关键的npm包:
pg
- Node.js的PostgreSQL客户端,用于连接YugabyteDBasync
- 处理异步流程控制的工具库
npm install pg async
配置数据库连接
创建一个config.js
文件来存储数据库连接配置:
module.exports = {
host: '127.0.0.1', // 集群主机地址
port: 5433, // YSQL默认端口
database: 'yugabyte', // 默认数据库名
user: 'yugabyte', // 用户名
password: 'yugabyte', // 密码
ssl: {
rejectUnauthorized: true,
ca: '/path/to/root/certificate' // CA证书路径
}
};
对于生产环境,建议使用环境变量来存储敏感信息。
实现核心功能
1. 数据库连接
创建db.js
文件实现连接逻辑:
const { Client } = require('pg');
const config = require('./config');
let client;
async function connect() {
try {
client = new Client(config);
await client.connect();
console.log('成功连接到YugabyteDB集群');
return client;
} catch (err) {
console.error('连接失败:', err);
throw err;
}
}
module.exports = { connect, getClient: () => client };
2. 数据表操作
创建models/account.js
实现数据表CRUD操作:
const { getClient } = require('../db');
class Account {
static async createTable() {
const client = getClient();
try {
await client.query('DROP TABLE IF EXISTS DemoAccount');
await client.query(`
CREATE TABLE DemoAccount (
id INT PRIMARY KEY,
name VARCHAR(100),
age INT,
country VARCHAR(100),
balance INT
)`);
console.log('成功创建DemoAccount表');
} catch (err) {
console.error('创建表失败:', err);
throw err;
}
}
static async insertSampleData() {
const client = getClient();
try {
await client.query(`
INSERT INTO DemoAccount VALUES
(1, 'Jessica', 28, 'USA', 10000),
(2, 'John', 28, 'Canada', 9000)`);
console.log('成功插入示例数据');
} catch (err) {
console.error('插入数据失败:', err);
throw err;
}
}
static async getAll() {
const client = getClient();
try {
const res = await client.query('SELECT * FROM DemoAccount');
return res.rows;
} catch (err) {
console.error('查询失败:', err);
throw err;
}
}
}
module.exports = Account;
3. 事务处理
在Account
类中添加转账方法,展示YugabyteDB的分布式事务能力:
static async transfer(fromId, toId, amount) {
const client = getClient();
try {
await client.query('BEGIN');
// 扣减转出账户余额
await client.query(
'UPDATE DemoAccount SET balance = balance - $1 WHERE id = $2',
[amount, fromId]
);
// 增加转入账户余额
await client.query(
'UPDATE DemoAccount SET balance = balance + $1 WHERE id = $2',
[amount, toId]
);
await client.query('COMMIT');
console.log(`成功转账${amount}元`);
} catch (err) {
await client.query('ROLLBACK');
console.error('转账失败:', err);
throw err;
}
}
主应用程序
创建app.js
作为应用入口:
const async = require('async');
const { connect } = require('./db');
const Account = require('./models/account');
async function run() {
try {
// 1. 连接数据库
await connect();
// 2. 创建表结构
await Account.createTable();
// 3. 插入示例数据
await Account.insertSampleData();
// 4. 查询所有账户
console.log('账户列表:');
const accounts = await Account.getAll();
accounts.forEach(acc => {
console.log(`${acc.name} (${acc.country}): ${acc.balance}元`);
});
// 5. 执行转账事务
await Account.transfer(1, 2, 800);
// 6. 验证转账结果
console.log('转账后账户列表:');
const updatedAccounts = await Account.getAll();
updatedAccounts.forEach(acc => {
console.log(`${acc.name} (${acc.country}): ${acc.balance}元`);
});
} catch (err) {
console.error('应用程序错误:', err);
} finally {
process.exit();
}
}
run();
运行应用程序
执行以下命令启动应用:
node app.js
预期输出示例:
成功连接到YugabyteDB集群
成功创建DemoAccount表
成功插入示例数据
账户列表:
Jessica (USA): 10000元
John (Canada): 9000元
成功转账800元
转账后账户列表:
Jessica (USA): 9200元
John (Canada): 9800元
最佳实践建议
-
连接池管理:在生产环境中,建议使用
pg.Pool
代替直接创建客户端,以提高性能。 -
错误处理:实现完善的错误处理机制,特别是对于分布式事务。
-
配置管理:使用dotenv等工具管理环境变量,避免将敏感信息硬编码。
-
性能监控:考虑添加查询性能监控,YugabyteDB提供了丰富的性能指标。
-
ORM选择:对于复杂应用,可以考虑使用TypeORM或Sequelize等ORM工具。
总结
通过本教程,您已经学会了:
- 如何配置Node.js应用连接YugabyteDB
- 执行基本的CRUD操作
- 处理分布式事务
- 构建一个完整的YugabyteDB应用
YugabyteDB的PostgreSQL兼容性使得Node.js开发者可以轻松迁移现有应用或构建新的分布式应用。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考