使用Node.js构建基于YugabyteDB的应用程序教程

使用Node.js构建基于YugabyteDB的应用程序教程

yugabyte-db yugabyte/yugabyte-db: 是 YugaByte DB 的官方仓库,一个高性能、高可扩展、分布式的 SQL 数据库,支持 PostgreSQL 兼容性。适合对分布式数据库、SQL 数据库和云原生应用的开发者。 yugabyte-db 项目地址: https://gitcode.com/gh_mirrors/yu/yugabyte-db

前言

YugabyteDB是一个高性能、云原生的分布式SQL数据库,兼容PostgreSQL协议。本文将详细介绍如何使用Node.js构建一个简单的应用程序来连接和操作YugabyteDB集群。

环境准备

在开始之前,请确保您已安装以下软件:

  1. Node.js最新稳定版本
  2. npm包管理器(通常随Node.js一起安装)

项目初始化

首先创建一个新的Node.js项目目录并初始化:

mkdir yugabyte-node-app && cd yugabyte-node-app
npm init -y

安装依赖

我们需要安装两个关键的npm包:

  1. pg - Node.js的PostgreSQL客户端,用于连接YugabyteDB
  2. async - 处理异步流程控制的工具库
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元

最佳实践建议

  1. 连接池管理:在生产环境中,建议使用pg.Pool代替直接创建客户端,以提高性能。

  2. 错误处理:实现完善的错误处理机制,特别是对于分布式事务。

  3. 配置管理:使用dotenv等工具管理环境变量,避免将敏感信息硬编码。

  4. 性能监控:考虑添加查询性能监控,YugabyteDB提供了丰富的性能指标。

  5. ORM选择:对于复杂应用,可以考虑使用TypeORM或Sequelize等ORM工具。

总结

通过本教程,您已经学会了:

  1. 如何配置Node.js应用连接YugabyteDB
  2. 执行基本的CRUD操作
  3. 处理分布式事务
  4. 构建一个完整的YugabyteDB应用

YugabyteDB的PostgreSQL兼容性使得Node.js开发者可以轻松迁移现有应用或构建新的分布式应用。

yugabyte-db yugabyte/yugabyte-db: 是 YugaByte DB 的官方仓库,一个高性能、高可扩展、分布式的 SQL 数据库,支持 PostgreSQL 兼容性。适合对分布式数据库、SQL 数据库和云原生应用的开发者。 yugabyte-db 项目地址: https://gitcode.com/gh_mirrors/yu/yugabyte-db

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

霍曙柏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值