Node.js works seamlessly with various databases. This guide covers integration with MySQL and MongoDB.

MySQL Integration

Setup

var mysql = require('mysql');

var con = mysql.createConnection({
    host: "localhost",
    user: "yourusername",
    password: "yourpassword",
    database: "mydb"
});

con.connect(function(err) {
    if (err) throw err;
    console.log("Connected!");
});

Basic Query

con.connect(function(err) {
    if (err) throw err;
    con.query("SELECT * FROM customers", function(err, result) {
        if (err) throw err;
        console.log(result);
    });
});

Insert Operations

// Single insert
var sql = "INSERT INTO customers (name, address) VALUES ('John', 'Highway 1')";
con.query(sql, function(err, result) {
    if (err) throw err;
    console.log("1 record inserted");
});

// Multiple insert
var sql = "INSERT INTO customers (name, address) VALUES ?";
var values = [
    ['John', 'Highway 71'],
    ['Peter', 'Lowstreet 4'],
    ['Amy', 'Apple st 652']
];
con.query(sql, [values], function(err, result) {
    if (err) throw err;
    console.log("Records inserted: " + result.affectedRows);
});

Query with Parameters

// Prevent SQL injection with placeholders
var sql = 'SELECT * FROM customers WHERE name = ? OR address = ?';
con.query(sql, [name, address], function(err, result) {
    if (err) throw err;
    console.log(result);
});

// Or use escape
var sql = 'SELECT * FROM customers WHERE address = ' + mysql.escape(address);

Result Object

For SELECT operations, result is an array of objects with field properties.

For INSERT/UPDATE operations:

{
    fieldCount: 0,
    affectedRows: 14,
    insertId: 0,
    serverStatus: 2,
    warningCount: 0,
    message: 'Records:14 Duplicated: 0 Warnings: 0',
    protocol41: true,
    changedRows: 0
}

Getting Column Information

con.query("SELECT name, address FROM customers", function(err, result, fields) {
    if (err) throw err;
    console.log(fields[0].name);  // Column name
});

MongoDB Integration

Setup

var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/mydb";

MongoClient.connect(url, function(err, db) {
    if (err) throw err;
    console.log("Database connected!");
    db.close();
});

Create Collection

MongoClient.connect(url, function(err, db) {
    if (err) throw err;
    db.createCollection("customers", function(err, res) {
        if (err) throw err;
        console.log("Collection created!");
        db.close();
    });
});

Insert Operations

// Insert one
var myobj = { name: "Company Inc", address: "Highway 37" };
db.collection("customers").insertOne(myobj, function(err, res) {
    if (err) throw err;
    console.log("1 document inserted");
    db.close();
});

// Insert many
var myobj = [
    { name: 'John', address: 'Highway 71'},
    { name: 'Peter', address: 'Lowstreet 4'}
];
db.collection("customers").insertMany(myobj, function(err, res) {
    if (err) throw err;
    console.log("Number of documents inserted: " + res.insertedCount);
    db.close();
});

Find Operations

// Find one
db.collection("customers").findOne({}, function(err, result) {
    if (err) throw err;
    console.log(result.name);
    db.close();
});

// Find all
db.collection("customers").find({}).toArray(function(err, result) {
    if (err) throw err;
    console.log(result);
    db.close();
});

Filtering

// Exact match
var query = { address: "Park Lane 38" };

// Regex filter
var query = { address: /^S/ };  // Starts with S

db.collection("customers").find(query).toArray(function(err, result) {
    if (err) throw err;
    console.log(result);
    db.close();
});

Sorting

// 1 for ascending, -1 for descending
var mysort = { name: 1 };

db.collection("customers").find().sort(mysort).toArray(function(err, result) {
    if (err) throw err;
    console.log(result);
    db.close();
});

Limit

db.collection("customers").find().limit(5).toArray(function(err, result) {
    if (err) throw err;
    console.log(result);
    db.close();
});

Update Operations

// Update one - all fields
var myquery = { address: "Valley 345" };
var newvalues = { name: "Mickey", address: "Canyon 123" };
db.collection("customers").updateOne(myquery, newvalues, function(err, res) {
    if (err) throw err;
    console.log("1 document updated");
    db.close();
});

// Update one - specific fields only
var newvalues = { $set: { address: "Canyon 123" } };
db.collection("customers").updateOne(myquery, newvalues, function(err, res) {
    if (err) throw err;
    console.log("1 document updated");
    db.close();
});

// Update many
var myquery = { address: /^S/ };
var newvalues = { $set: { name: "Minnie" } };
db.collection("customers").updateMany(myquery, newvalues, function(err, res) {
    if (err) throw err;
    console.log(res.result.nModified + " document(s) updated");
    db.close();
});

Delete Operations

// Delete one
var myquery = { address: 'Mountain 21' };
db.collection("customers").deleteOne(myquery, function(err, obj) {
    if (err) throw err;
    console.log("1 document deleted");
    db.close();
});

// Delete many
var myquery = { address: /^O/ };
db.collection("customers").deleteMany(myquery, function(err, obj) {
    if (err) throw err;
    console.log(obj.result.n + " document(s) deleted");
    db.close();
});

Drop Collection

db.collection("customers").drop(function(err, delOK) {
    if (err) throw err;
    if (delOK) console.log("Collection deleted");
    db.close();
});

// Or
db.dropCollection("customers", function(err, delOK) {
    if (err) throw err;
    if (delOK) console.log("Collection deleted");
    db.close();
});

Join (Aggregation)

db.collection('orders').aggregate([
    { $lookup: {
        from: 'products',
        localField: 'product_id',
        foreignField: '_id',
        as: 'orderdetails'
    }}
], function(err, res) {
    if (err) throw err;
    console.log(res);
    db.close();
});

// Result:
// {
//   _id: 1,
//   product_id: 154,
//   status: 1,
//   orderdetails: [{ _id: 154, name: 'Chocolate Heaven' }]
// }

Headless Browser

For web scraping and automation, use Puppeteer:

Puppeteer Setup

npm i --save puppeteer

Basic Usage

const puppeteer = require('puppeteer');

(async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();

    await page.goto('https://example.com');
    await page.screenshot({path: 'example.png'});

    await browser.close();
})();

Options

// Show browser window
const browser = await puppeteer.launch({headless: false});

// Use different Chrome version
const browser = await puppeteer.launch({executablePath: '/path/to/Chrome'});

// Wait for network idle
await page.goto(url, {"waitUntil": "networkidle0"});

Page Interaction

// Get document handle
const aHandle = await page.evaluateHandle('document');

// Query selectors
const element = await page.$(selector);
const elements = await page.$$(selector);

// Evaluate expressions
const count = await page.$$eval('div', divs => divs.length);
const value = await page.$eval('#search', el => el.value);
const html = await page.$eval('.main', e => e.outerHTML);

Screenshot and PDF

// Screenshot
await page.screenshot({path: 'screenshot.png'});

// PDF
await page.pdf({path: 'page.pdf', format: 'A4'});

Chrome Launcher

For more control over Chrome launching:

const chromeLauncher = require('chrome-launcher');

chromeLauncher.launch({
    startingUrl: 'https://google.com',
    chromeFlags: ['--headless', '--disable-gpu']
}).then(chrome => {
    console.log(`Chrome debugging port: ${chrome.port}`);
});

Node.js provides excellent database integration capabilities, making it easy to build full-stack JavaScript applications with either SQL or NoSQL databases.