nodejs2 Min Read

How to connect to mysql from nodejs, with ES6 promise

Gorav Singal

March 30, 2020

TL;DR

Use Node.js mysql module with ES6 promisify to convert callback-based MySQL queries into promise-based async/await calls for cleaner database automation scripts.

How to connect to mysql from nodejs, with ES6 promise

Introduction

I had to develop a small automation to query some old mysql data, with given product names. The mysql database had a table name products, and I was intersted in three fields:

name, created_at, updated_at

I had a text file with product names in one line, and had to query the two dates from the table. I wrote a small nodejs automation for this.

Expected Output

The expected ourput I wanted is a csv file:

ProductName, created_at, updated_at

Npm Modules Used

  • MySql The core module which has apis to connect to mysql. All the apis are callback based, not in promise form.

  • es6-promisify This module is used to convert mysql module’s apis into promised form. This module is very handy.

  • async I want to perform async loop with promises in between.

  • momentjs I wanted to format some dates from mysql table.

Code

I wrote a mysql client class to query this.

const mysql = require('mysql');
const {promisify} = require("es6-promisify");
const async = require('async');
const moment = require('moment');

class Client {
    init(config) {
        console.log('Connecting to mysql...');
        this.__connection = mysql.createConnection({
            host : config.host,
            user : config.user,
            password : config.password,
            database : config.database
            });
        this.__connection.connect();
        this.__query = promisify(this.__connection.query.bind(this.__connection));

        console.log('connected');
        return Promise.resolve();
    }

    testQuery(lines) {
        return new Promise((resolve, reject) => {
            async.eachLimit(lines, 1, (line, callback) => {
                if (line) {
                    const query = `select * from products where name like \'%${line.trim()}%\'`;
                    return this.__query(query)
                        .then((res) => {
                            if (res && res.length > 0) {
                                const cd = moment(res[0].created_at).format('DD-MM-YYYY');
                                const ud = moment(res[0].updated_at).format('DD-MM-YYYY');
                                console.log(`${line.trim()},${cd},${ud}`);
                            }
                            else {
                                console.error('ERROR', line.trim());
                            }
                            callback();
                        })
                        .catch((err) => {
                            callback(err);
                        });
                }
                else {
                    callback();
                }
            }, function (err) {
                if (err) {
                    reject(err);
                } else {
                    console.log('Done');
                    resolve();
                }
            });
        });
    }
}

module.exports = new Client();

And, a main app file


// my above client class
const client = require('./src/product_mysql/client');

const fs = require('fs');
const async = require('async');
// file from where to read product names
const data = fs.readFileSync('<path>/prod_names.txt', 'UTF-8');
const lines = data.split(/\r?\n/);

const config = {
    host     : 'localhost',
    user     : 'xxxxx',
    password : 'xxxxxxxx',
    database : 'xxxxxx'
};
return client.init(config)
    .then(() => {
        return client.testQuery(lines);
    })
    .then( () => {
        console.log('Success');
    })
    .catch(err => {
        console.error(err);
    });

Note: For logging purpose, I just used simple console.log statements. I should have winston module. But, this was a small automation and I don’t need that much effort.

Running the Program and Output

To run program

node app

Output

Android-DEXI Framework,03-11-2016,12-03-2018
Mobile-Files,03-11-2016,12-03-2018
Sekhmet,03-11-2016,12-03-2018
Sample,03-11-2016,12-03-2018
Codex and Build 2 Ship,03-11-2016,12-03-2018
Test Touch,03-11-2016,12-03-2018

Let me know if you have any query.

Share

Related Posts

Nodejs - Json object schema validation with Joi

Nodejs - Json object schema validation with Joi

Introduction In this post, I will show how to validate your json schema…

Mongoose - Using CRUD operations in mongodb in nodejs

Mongoose - Using CRUD operations in mongodb in nodejs

MongoDB CRUD Operations Mongoose provides a simple schema based solution to…

MySql update query - Update column by string replacement in all records

MySql update query - Update column by string replacement in all records

Problem Statement In a mysql table, I wanted to replace the hostname of the…

How to check whether a website link has your URL backlink or not - NodeJs implementation

How to check whether a website link has your URL backlink or not - NodeJs implementation

Introduction I got my seo backlink work done from a freelancer. It was like 300…

WebSockets with Socket.io in Node.js

WebSockets with Socket.io in Node.js

WebSocket vs HTTP Traditional HTTP follows a request/response model — the client…

Testing Node.js — Unit, Integration, and E2E

Testing Node.js — Unit, Integration, and E2E

Testing Strategy A solid testing strategy follows the testing pyramid — many…

Latest Posts

AI Video Generation in 2025 — Models, Costs, and How to Build a Cost-Effective Pipeline

AI Video Generation in 2025 — Models, Costs, and How to Build a Cost-Effective Pipeline

AI video generation went from “cool demo” to “usable in production” in 2024-202…

AI Models in 2025 — Cost, Capabilities, and Which One to Use

AI Models in 2025 — Cost, Capabilities, and Which One to Use

Choosing the right AI model is one of the most impactful decisions you’ll make…

AI Image Generation in 2025 — Models, Costs, and How to Optimize Spend

AI Image Generation in 2025 — Models, Costs, and How to Optimize Spend

Generating one image with AI costs between $0.002 and $0.12. That might sound…

AI Coding Assistants in 2025 — Every Tool Compared, and Which One to Actually Use

AI Coding Assistants in 2025 — Every Tool Compared, and Which One to Actually Use

Two years ago, AI coding meant one thing: GitHub Copilot autocompleting your…

AI Agents Demystified — It's Just Automation With a Better Brain

AI Agents Demystified — It's Just Automation With a Better Brain

Let’s cut through the noise. If you read Twitter or LinkedIn, you’d think “AI…

Security Ticketing and Incident Response

Security Ticketing and Incident Response

The worst time to figure out your incident response process is during an…