nodejs

پلتفرم NodeJS

(NodeJS Platform)

اتصال به دیتابیس‌ها

فهرست عناوین:

MySQL/MariaDB

در صورتی که تمایلی به خواندن آموزش متنی ندارید می‌توانید ویدیوی آموزشی زیر ‌را مشاهده کنید.

روش‌ها و کتابخانه‌های مختلفی برای اتصال به MySQL/MariaDB در NodeJS وجود دارد. یکی از این راه‌ها، استفاده از پکیج mysql است که در ابتدا، با اجرای دستور زیر، باید آن را نصب کنید:

npm install mysql

پس از آن، کافیست که در بخش تنظیمات، متغیرهای برنامه خود، اطلاعات مربوط به دیتابیس خود را وارد کنید. به عنوان مثال:

DB_HOST=olympus.liara.cloud
DB_PORT=34008
DB_NAME=festive_villani
DB_USER=root
DB_PASS=d0NRg5Rh7TzbAzJVl7SyeMAB

و در برنامه به این صورت اطلاعات را خوانده و به دیتابیس متصل شوید:

const express = require('express');
const mysql = require('mysql');

const app = express();

const dbConfig = {
  host: process.env.DB_HOST,
  port: process.env.DB_PORT,
  database: process.env.DB_NAME,
  user: process.env.DB_USER,
  password: process.env.DB_PASS
};
const connection = mysql.createConnection(dbConfig);

connection.connect((err) => {
  if (err) {
    console.error('error in connecting to db:', err);
    app.locals.dbConnected = false;
    return;
  }

  console.log('connected to db successfully');
  app.locals.dbConnected = true;
});

app.get('/', (req, res) => {
  res.send(app.locals.dbConnected ? 'connected to db successfully' : 'error in connecting to db!');
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`server is listening on port ${PORT}`);
});

process.on('SIGINT', () => {
  connection.end();
  console.log('db disconnected.');
  process.exit();
});

MongoDB

در صورتی که تمایلی به خواندن آموزش متنی ندارید می‌توانید ویدیوی آموزشی زیر ‌را مشاهده کنید.

برای اتصال به دیتابیس MongoDB، می‌توانید از پکیج mongodb استفاده کنید، برای نصب این پکیج، کافیست تا در مسیر اصلی پروژه خود، دستور زیر را اجرا کنید:

npm install mongoose

سپس، کافیست تا در بخش تنظیمات، متغیرها، URI دیتابیس mongodb خود را وارد کنید. به عنوان مثال:

MONGODB_URI=mongodb://root:fWy9QPKw8CxTUGCMd6esZSlu@mongo:27017/my-app?authSource=admin

و در برنامه به این صورت اطلاعات را خوانده و به دیتابیس متصل شوید:

const express = require('express');
const mongoose = require('mongoose');

const app = express();

mongoose.connect(process.env.MONGODB_URI, {
})
.then(() => {
  console.log('connected to db successfully');
})
.catch((err) => {
  console.error('error in connecting to db:', err);
});


app.get('/', (req, res) => {
  res.send(mongoose.connection.readyState === 1 ? 'connection to db successfull' : 'error in connecting to db');
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`server is listening on port ${PORT}`);
});

process.on('SIGINT', () => {
  mongoose.connection.close(() => {
    console.log('db disconnected.');
    process.exit();
  });
});

PostgreSQL

در صورتی که تمایلی به خواندن آموزش متنی ندارید می‌توانید ویدیوی آموزشی زیر ‌را مشاهده کنید.

برای اتصال به دیتابیس Postgres، می‌توانید از پکیج pg استفاده کنید، برای نصب این پکیج، کافیست تا در مسیر اصلی پروژه خود، دستور زیر را اجرا کنید:

npm install pg

سپس، کافیست تا در بخش تنظیمات، متغیرها، URI دیتابیس Postgres خود را وارد کنید. به عنوان مثال:

PG_URI=postgresql://root:jpR53iIAhADgqsJ3ufVE1v94@pgo:5432/postgres

و در برنامه به این صورت اطلاعات را خوانده و به دیتابیس متصل شوید:

const express = require('express');
const { Pool } = require('pg');

const app = express();

const dbURI = process.env.PG_URI;

const pool = new Pool({
  connectionString: dbURI,
});

pool.connect((err) => {
  if (err) {
    console.error('Error connecting to PostgreSQL database:', err);
    app.locals.dbConnected = false;
    return;
  }
  console.log('Connected to PostgreSQL database successfully');
  app.locals.dbConnected = true;
});

app.get('/', (req, res) => {
  res.send(app.locals.dbConnected ? 'Connection to database successful.' : 'Error connecting to database.');
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Web server is running on port ${PORT}`);
});

process.on('SIGINT', () => {
  pool.end();
  console.log('Database connection closed');
  process.exit();
});

MSSQL

برای اتصال به دیتابیس SQL Server، می‌توانید از پکیج mssql استفاده کنید، برای نصب این پکیج، کافیست تا در مسیر اصلی پروژه خود، دستور زیر را اجرا کنید:

npm install mssql

سپس، کافیست تا در بخش تنظیمات، متغیرها، اطلاعات دیتابیس SQL Server خود را وارد کنید. به عنوان مثال:

DB_HOST=mssql
DB_PORT=1433
DB_USER=sa
DB_PASS=4OTujub1cJeXYuRlgNFe5pHz
DB_NAME=master

و در برنامه به این صورت اطلاعات را خوانده و به دیتابیس متصل شوید (در مثال زیر، چند کوئری نیز، اجرا‌ می‌شود):

const express = require('express');
const sql = require('mssql');

const app = express();

const DB_HOST= process.env.DB_HOST;
const DB_PORT= process.env.DB_PORT;
const DB_USER= process.env.DB_USER;
const DB_PASS= process.env.DB_PASS;
const DB_NAME= process.env.DB_NAME;

async function connectAndQuery() {
  try {
    
    await sql.connect(`Server=${DB_HOST},${DB_PORT};Database=${DB_NAME};User Id=${DB_USER};Password=${DB_PASS};Encrypt=false`)
        
    await sql.query`CREATE TABLE test_table (id INT IDENTITY(1,1) PRIMARY KEY, name NVARCHAR(50));`;
    await sql.query`INSERT INTO test_table (name) VALUES ('Sample Record');`;

    const result = await sql.query`SELECT * FROM test_table`;
    return result.recordset;
  } catch (err) {
    console.error('Error executing SQL query:', err);
    throw err;
  } finally {
    await sql.close();
  }
}

app.get('/', async (req, res) => {
  try {
    
    const data = await connectAndQuery();
    res.send(data);
  } catch (err) {
    res.status(500).send('Error retrieving data from database.');
  }
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Web server is running on port ${PORT}`);
});

SQLite

در صورتی که تمایلی به خواندن آموزش متنی ندارید می‌توانید ویدیوی آموزشی زیر ‌را مشاهده کنید.

برای اتصال موفق به دیتابیس SQLite در برنامه‌های NodeJS کافیست تا گام‌های زیر را طی کنید:

  • گام اول) با اجرای دستور زیر، ماژول مورد نیاز SQLite را نصب کنید:
  • npm install sqlite3
  • گام دوم) در مسیر اصلی پروژه، یک دایرکتوری به نام db (یا هر نام دلخواه دیگری) ایجاد کنید.
  • گام سوم) از قطعه کد زیر در برنامه اصلی خود، استفاده کنید (می‌توانید آن را بنا به نیاز خود، تغییر دهید):
  • const express = require('express');
    const sqlite3 = require('sqlite3').verbose();
    
    const app = express();
    const db = new sqlite3.Database('db/database.db');
    
    db.serialize(() => {
      db.run("CREATE TABLE IF NOT EXISTS lorem (info TEXT)");
      const stmt = db.prepare("INSERT INTO lorem VALUES (?)");
      for (let i = 0; i < 10; i++) {
          stmt.run("Ipsum " + i);
      }
      stmt.finalize();
    });
    
    app.once('started', () => {
      app.get('/', async (req, res) => {
        db.all("SELECT rowid AS id, info FROM lorem", (err, rows) => {
          if (err) {
            return res.status(500).send('Error retrieving data from database');
          }
          res.send(rows.map(row => `${row.id}: ${row.info}`).join('<br>'));
        });
      });
    });
    
    app.listen(3000, () => {
      console.log('Server is running on port 3000');
      app.emit('started');
    });
  • گام چهارم) در بخش دیسک‌ها برنامه خود در لیارا، یک دیسک جدید با نام database و اندازه مدنظرتان ایجاد کنید.
  • گام پنجم) در مسیر اصلی پروژه، یک فایل به نام liara.json ایجاد کنید و قطعه کد زیر را، درون آن، قرار دهید:
  • {
        "disks": [
            {
                "name": "database",
                "mountTo": "db"
            }
        ]
    }
  • گام ششم و نهایی) برنامه خود را با استفاده از دستور liara deploy در لیارا مستقر کنید.

ماژول Sequelize

Sequelize یک ORM مدرن در NodeJS و TypeScript است که از دیتابیس‌های Postgres , MySQL , MariaDB , SQLite , SQL Server و .... پشتیبانی می‌کند. این ORM از قابلیت‌های بسیار زیادی از جمله solid tranaction , relation , lazy loading و replication نیز پشتیبانی می‌کند و ابزار خیلی مناسبی است تا بتوانید هرچه راحت‌تر از قبل، برنامه خود را توسعه دهید.

برای نصب Sequelize، کافیست تا دستور زیر را اجرا کنید:

npm install --save sequelize

در ادامه، نحوه اتصال به هردیتابیس با استفاده از ماژول Sequelize را بررسی خواهیم کرد.

اتصال به MySQL با استفاده از Sequelize

در ابتدا، بایستی ماژول مربوط به دیتابیس را با اجرای دستور زیر، نصب کنید:

npm install --save mysql2

در ادامه، کافیست تا URI مربوط به دیتابیس خود را به متغیرهای محیطی برنامه NodeJS خود، اضافه کنید:

MYSQL_URI=mysql://root:lnhJ9VUqkaa86ynCtopRaqOU@maria:3306/jovial_chebyshev

در نهایت، می‌توانید با استفاده از قطعه کد زیر، به دیتابیس خود، متصل شوید:

const express = require('express');
const { Sequelize } = require('sequelize');

const app = express();
const sequelize = new Sequelize(process.env.MYSQL_URI, {
  logging: (...msg) => console.log(msg),
  pool: {
    max: 5,
    min: 0,
    acquire: 30000,
    idle: 10000
  }
}); 

async function testDatabaseConnection() {
  try {
    await sequelize.authenticate();
    return 'Connection has been established successfully.';
  } catch (error) {
    return `Unable to connect to the database: ${error}`;
  }
}

app.get('/', async (req, res) => {
  const result = await testDatabaseConnection();
  res.send(result);
});

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});
اتصال به Mariadb با استفاده از Sequelize

در ابتدا، بایستی ماژول مربوط به دیتابیس را با اجرای دستور زیر، نصب کنید:

npm install --save mariadb

در ادامه، کافیست تا اطلاعات مربوط به دیتابیس خود را به متغیرهای محیطی برنامه NodeJS خود، اضافه کنید:

DB_HOST=mariae
DB_PORT=3306
DB_USER=root
DB_PASS=lnhJ9VUqkaa86ynCtopRaqOU
DB_NAME=jovial_chebyshev

در نهایت، می‌توانید با استفاده از قطعه کد زیر، به دیتابیس خود، متصل شوید:

const express = require('express');
const { Sequelize } = require('sequelize');

const app = express();
const sequelize = new Sequelize(process.env.DB_NAME, process.env.DB_USER, process.env.DB_PASS, {
    host: process.env.DB_HOST,
    port: process.env.DB_PORT,
    dialect: 'mariadb',
    logging: (...msg) => console.log(msg),
    pool: {
        max: 5,
        min: 0,
        acquire: 30000,
        idle: 10000
    }
}); 

async function testDatabaseConnection() {
  try {
    await sequelize.authenticate();
    return 'Connection has been established successfully.';
  } catch (error) {
    return `Unable to connect to the database: ${error}`;
  }
}

app.get('/', async (req, res) => {
  const result = await testDatabaseConnection();
  res.send(result);
});

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});
اتصال به PostgreSQL با استفاده از Sequelize

در ابتدا، بایستی ماژول مربوط به دیتابیس را با اجرای دستور زیر، نصب کنید:

npm install --save pg pg-hstore

در ادامه، کافیست تا اطلاعات مربوط به دیتابیس خود را به متغیرهای محیطی برنامه NodeJS خود، اضافه کنید:

PG_URI=postgresql://root:IcAQA5ohOTrbwqOmMCSNJzyS@pgoo:5432/postgres

در نهایت، می‌توانید با استفاده از قطعه کد زیر، به دیتابیس خود، متصل شوید:

const express = require('express');
const { Sequelize } = require('sequelize');

const app = express();
const sequelize = new Sequelize(process.env.PG_URI, {
    logging: (...msg) => console.log(msg),
    pool: {
        max: 5,
        min: 0,
        acquire: 30000,
        idle: 10000
    }
}); 

async function testDatabaseConnection() {
  try {
    await sequelize.authenticate();
    return 'Connection has been established successfully.';
  } catch (error) {
    return `Unable to connect to the database: ${error}`;
  }
}

app.get('/', async (req, res) => {
  const result = await testDatabaseConnection();
  res.send(result);
});

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});
اتصال به MSSQL با استفاده از Sequelize

در ابتدا، بایستی ماژول مربوط به دیتابیس را با اجرای دستور زیر، نصب کنید:

npm install --save tedious

در ادامه، کافیست تا اطلاعات مربوط به دیتابیس خود را به متغیرهای محیطی برنامه NodeJS خود، اضافه کنید:

DB_HOST=mydbo
DB_PORT=1433
DB_USER=sa
DB_PASS=hFI323Wf7f9FdpKZZqaBw57s
DB_NAME=new_db

در نهایت، می‌توانید با استفاده از قطعه کد زیر، به دیتابیس خود، متصل شوید:

const express = require('express');
const { Sequelize } = require('sequelize');

const app = express();
const sequelize = new Sequelize(process.env.DB_NAME, process.env.DB_USER, process.env.DB_PASS, {
    host: process.env.DB_HOST,
    port: process.env.DB_PORT,
    dialect: 'mssql',
    logging: (...msg) => console.log(msg),
    pool: {
        max: 5,
        min: 0,
        acquire: 30000,
        idle: 10000
    }
}); 

async function testDatabaseConnection() {
  try {
    await sequelize.authenticate();
    return 'Connection has been established successfully.';
  } catch (error) {
    return `Unable to connect to the database: ${error}`;
  }
}

app.get('/', async (req, res) => {
  const result = await testDatabaseConnection();
  res.send(result);
});

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});
اتصال به Sqlite با استفاده از Sequelize

برای اتصال اصولی به دیتابیس SQLite، بایستی گام‌های زیر را به ترتیب انجام دهید تا برنامه با موفقیت در لیارا، آپلود شود:

  • گام اول) ماژول مربوط به دیتابیس SQLite را با اجرای دستور زیر، نصب کنید:
  • npm install --save sqlite3
  • گام دوم) سپس، با استفاده از قطعه کد زیر، به دیتابیس SQLite متصل شوید (حتماً دیتابیس باید درون یک دایرکتوری باشد، می‌توانید نام دایرکتوری و دیتابیس را تغییر دهید):
  • const express = require('express');
    const { Sequelize } = require('sequelize');
    
    const app = express();
    const sequelize = new Sequelize({
        dialect: 'sqlite',
        storage: 'db/database.sqlite',
        logging: (...msg) => console.log(msg),
        pool: {
            max: 5,
            min: 0,
            acquire: 30000,
            idle: 10000
        }
    }); 
    
    async function testDatabaseConnection() {
      try {
        await sequelize.authenticate();
        return 'Connection has been established successfully.';
      } catch (error) {
        return `Unable to connect to the database: ${error}`;
      }
    }
    
    app.get('/', async (req, res) => {
      const result = await testDatabaseConnection();
      res.send(result);
    });
    
    app.listen(3000, () => {
      console.log('Server is running on port 3000');
    });
    
  • گام سوم) در بخش دیسک‌ها در برنامه NodeJS لیارا، یک دیسک جدید به نام database و با اندازه مدنظر خود، ایجاد کنید.
  • گام چهارم) در مسیر اصلی پروژه، یک فایل به نام liara.json ایجاد کنید و قطعه کد زیر را درون آن، قرار دهید (مقدار فیلد mountTo با توجه به نام دایرکتوری دیتابیس شما، متفاوت است):
  • {
        "disks": [
            {
                "name": "database",
                "mountTo": "db"
            }
        ]
    }
  • گام پنجم) با اجرای دستور liara deploy برنامه خود را در لیارا مستقر کنید.
توضحیات و نکات تکمیلی در استفاده از ماژول Sequelize
قابلیت Connection Pooling

در قطعه کدهای ارائه شده، قابلیت Conneciton Pooling، در تمامی دیتابیس‌های مذکور، تعبیه شده است؛ البته اگر که قصد دارید تا مقادیر آن را خودتان پیکربندی کنید، کافیست که قطعه کد زیر را به برنامه خود، اضافه کنید:

const sequelize = new Sequelize(/* تنظیمات دیتابیس */, {
  // دیگر تنظیمات
  pool: {
    max: 5,
    min: 0,
    acquire: 30000,
    idle: 10000
  }
});
لاگ‌گیری دیتابیس

در کدهای ارائه داده شده، با استفاده از قطعه کد زیر لاگ‌های کامل مربوط به دیتابیس، در بخش لاگ‌های برنامه، به شما نمایش داده می‌شوند:

logging: (...msg) => console.log(msg),

اما اگر که به لاگ کامل دیتابیس نیاز ندارید، می‌توانید قطعه کد فوق را، از برنامه‌تان حذف کنید. اگر که در کل، نیازی به دریافت لاگ‌های دیتابیس ندارید؛ می‌توانید دستور logging: false, را جایگزین قطعه کد فوق، کنید.

اگر که قصد دارید از loggerهای دیگری مثل Winston استفاده کنید؛ کافیست تا کد زیر را جایگزین قطعه کد فوق، کنید:

logging: msg => logger.debug(msg),

استفاده از Connection Pooling

شما می‌توانید در برنامه NodeJS خود، قابلیت Connection Pooling را نیز فعال کنید. در Connection Pooling برنامه به جای ایجاد یک ارتباط (Connection) جدید برای انجام عملیات دیتابیسی و بستن آن پس از پایان عملیات، از ارتباط‌هایی که قبلاً ایجاد شده‌اند، استفاده می‌کند.

استفاده از Connection Pooling کارایی برنامه را افزایش می‌دهد و تاثیر بسیار زیادی در بهینه‌سازی و کاهش منابع مورد استفاده برنامه و دیتابیس دارد. بنابراین توصیه می‌شود که حتماً در حالت Production، از این قابلیت، استفاده کنید. در ادامه، به نحوه فعال‌سازی این قابلیت با توجه به نوع هر دیتابیس، خواهیم پرداخت:

قابلیت Connection Pooling در دیتابیس MySQL/MariaDB

برای فعال‌سازی این قابلیت در دیتابیس MySQL یا MariaDB کافیست تا پکیج mysql2 را با استفاده از دستور زیر در پروژه خود نصب کنید:

npm install mysql2 

سپس، می‌توانید مانند قطعه کد زیر، از Connection Pooling استفاده کنید:

const mysql = require('mysql2/promise');

const dbConfig = {
  host: process.env.DB_HOST,
  port: process.env.DB_PORT,
  database: process.env.DB_NAME,
  user: process.env.DB_USER,
  password: process.env.DB_PASS,
  waitForConnections: true,
  connectionLimit: 10,
  queueLimit: 0,
};
const pool = mysql.createPool(dbConfig);


(async () => {
  try {
    const connection = await pool.getConnection();
    console.log('Connected to the MySQL server.');
    connection.release();
  } catch (error) {
    console.error('Error connecting to the MySQL server:', error);
  }
})();
قابلیت Connection Pooling در دیتابیس MongoDB

برای استفاده از این قابلیت در دیتابیس MongoDB نیاز به انجام کار خاصی نیست. صرفاً کافیست تا در آپشن‌های اتصال به دیتابیس، مقدار فیلد maxPoolSize را مشخص کنید:

const express = require('express');
const mongoose = require('mongoose');

const app = express();

// Create a connection pool
const dbOptions = {
  maxPoolSize: 10, // Set the pool size as needed
};

mongoose.connect(process.env.MONGODB_URI, dbOptions)
  .then(() => {
    console.log('connected to db successfully');
  })
  .catch((err) => {
    console.error('error in connecting to db:', err);
  });

app.get('/', (req, res) => {
  res.send(mongoose.connection.readyState === 1 ? 'connection to db successful' : 'error in connecting to db');
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`server is listening on port ${PORT}`);
});

قابلیت Connection Pooling در دیتابیس PostgreSQL

برای فعال‌سازی این قابلیت در دیتابیس PostgreSQL کافیست تا پکیج pg-pool را با استفاده از دستور زیر در پروژه خود نصب کنید:

npm install pg-pool

در نهایت، کافیست تا در مرحله اتصال به دیتابیس یک‌سری آپشن اضافه کنید تا امکان استفاده از Connection Pool مهیا شود:

const express = require('express');
const { Pool } = require('pg');

const app = express();

const pool = new Pool({
  user: process.env.DB_USER,
  host: process.env.DB_HOST,
  database: process.env.DB_NAME,
  password: process.env.DB_PASS,
  port: process.env.DB_PORT,
  max: 20, // maximum number of connections in the pool
  idleTimeoutMillis: 30000, // how long a client is allowed to remain idle before being closed
  connectionTimeoutMillis: 2000, // how long to wait for a connection to be established
});

pool.connect((err) => {
  if (err) {
    console.error('Error connecting to PostgreSQL database:', err);
    app.locals.dbConnected = false;
    return;
  }
  console.log('Connected to PostgreSQL database successfully');
  app.locals.dbConnected = true;
});

app.get('/', (req, res) => {
  res.send(app.locals.dbConnected ? 'Connection to database successful.' : 'Error connecting to database.');
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Web server is running on port ${PORT}`);
});

process.on('SIGINT', () => {
  pool.end();
  console.log('Database connection closed');
  process.exit();
});
قابلیت Connection Pooling در دیتابیس MSSQL

برای فعال‌سازی این قابلیت، کافیست تا فیلد poolرا به شکل زیر، به قطعه کد اتصال به دیتابیس، اضافه کنید:

const sql = require('mssql');

const appPool = new sql.ConnectionPool({
    server: process.env.DB_HOST,
    port: process.env.DB_PORT,
    user: process.env.DB_USER,
    password: process.env.DB_PASS,
    database: process.env.DB_NAME,
    pool: {
        min: 10,
        max: 100,
        acquireTimeoutMillis: 15000,
    },
    options: {
      encrypt: false,
      trustServerCertificate: false
  }
});

appPool.connect().then(pool => {
    console.log(`SERVER: Connected to the db and ${pool.available} connections are available!`);
});

متوجه شدم، برو گام بعدی!
;