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…

Supply Chain Security — Protecting Your Software Pipeline

Supply Chain Security — Protecting Your Software Pipeline

In 2024, a single malicious contributor nearly compromised every Linux system on…