[A-00191] Node.js 入門

node.jsの入門用の記事です。これを参考に学習していただければと思います。

本記事は同時に自分の学習用でもあるため、興味の沸いた事しか書いてません。

少しずつ内容を増やしていこうと思います。

・とりあえずNode.jsで「Hello,world!」してみる

まずNode.jsでjavascriptの実行方法を確認するためHello,worldしてみます。

ソースコードは下記のみです。適当な場所に作成してください。

console.log("Hello,world!")

下記のコマンドで実行します。

node main.js
$ node main.js 
Hello,world!

・JSでファイルを読み込んでみる

ファイル読み込みを行います。

適当なテキストファイルを作成します。

これはjavascriptでファイルを読み込むテストです。

.jsファイルは以下の通りです。

const fs = require('fs');
let text = fs.readFileSync('test.txt', 'utf-8');
console.log(text);

下記で実行します。

node main.js
$ node main.js
これはjavascriptでファイルを読み込むテストです。

・ファイル書き込みを行う

プログラムはこちら

const fs = require('fs');
let text = "この内容をファイルに書き出します。";
fs.writeFileSync('testWrite.txt', text, (err) => {
    if (err) throw err;
});
console.log("ファイル書き込み完了.");

実行結果はこちら

$ node main.js
ファイル書き込み完了.
この内容をファイルに書き出します。

・ クラスを作成してみる

クラスファイルを作成してみます。

ディレクトリ構造は下記の通りです。

module.exports = class Person {
    constructor(name, age, country) {
        this.name = name;
        this.age = age;
        this.country = country;
    }

    sayHello() {
        console.log(`Hello, my name is ${this.name}.`);
        console.log(`I'm ${this.age} years old.`);
        console.log(`I'm live in ${this.country}.`);
    }
}

const personClass = require("./person");

let p = new personClass("satoshi", 14, "Japan");
p.sayHello();

実行したら下記の通りになります。

$ node main.js 
Hello, my name is satoshi.
I'm 14 years old.
I'm live in Japan.

・クラスをextendsしてみる

作成したPersonクラスをextendsして別のクラスを作成してみます。

ディレクトリ構成は下記の通りです。

 class Person {
    constructor(name, age, country) {
        this.name = name;
        this.age = age;
        this.country = country;
    }

    sayHello() {
        console.log(`Hello, my name is ${this.name}.`);
        console.log(`I'm ${this.age} years old.`);
        console.log(`I'm live in ${this.country}.`);
    }
}

module.exports = { Person };
const { Person } = require("./iface/person");

module.exports = class BusinessPerson extends Person {
    constructor(name, age, country, job) {
        super(name, age, country);
        this.job = job
    }

    sayHello() {
        super.sayHello();
        console.log(`I'm work as ${this.job}.`);
    }
}
const BusinessPerson = require("./business_person");


let bzp = new BusinessPerson("satoshi", 14, "Japan", "Student");
bzp.sayHello();

実行したら下記の通りとなります。

$ node main.js 
Hello, my name is satoshi.
I'm 14 years old.
I'm live in Japan.
I'm work as Student.

[DB接続]

・データを取得してみる(MySQL)

mysqlからデータをselectしてみます。

まずnpmでmysqlパッケージをnodeにインストールします。

npm install mysql
npm upgrade mysql

上記を実行したらmysqlをスタートしておきます。

$ mysql.server start
Starting MySQL
..... SUCCESS!

mysqlには下記のdatabaseとtableがあるものとします。

+--------------------+
| Database           |
+--------------------+
| employee_db        |
+--------------------+
+-----------------------+
| Tables_in_employee_db |
+-----------------------+
| users                 |
+-----------------------+

使用するユーザーはなんでも構いませんのでrootにします。passwordは[password]です。mysql8を使用する場合下記の処理が必要になるかもしれません。

mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
flush privileges;
mysql> SELECT user, host, plugin FROM mysql.user;

mysqlには問題なく接続できるという前提で下記のコードを実装します。

const mysql = require('mysql')

const conn = mysql.createConnection({
    host:'localhost',
    user:'root',
    password:'password',
    database:'employee_db'
})

conn.connect((err) => {
    if (err) {
        console.log('error connecting:' + err.stack);
        return;
    }
    console.log('connecting success');
});

conn.query('SELECT * FROM users', (error, resultSet) => {
    console.log(resultSet);
})

実行すると下記の通りになります。selectされたデータは環境によって異なるため、表示されればOKです。

$ node select_data_main.js 
connecting success
[
  RowDataPacket {
    id: 1,
    department_id: '1',
    email: 'johnson.smarty@gmail.com',
    first_name: 'Johnson',
    last_name: 'Smarty'
  },
  RowDataPacket {
    id: 2,
    department_id: '2',
    email: 'h.midway@gmail.com',
    first_name: 'Hardy',
    last_name: 'Midway'
  },
  RowDataPacket {
    id: 3,
    department_id: '4',
    email: 'v.wood@example.com',
    first_name: 'ViVian',
    last_name: 'Westwood'
  },
  RowDataPacket {
    id: 4,
    department_id: '2',
    email: 'bb@gmail.com',
    first_name: 'Basis',
    last_name: 'Brook'
  }
]

・データを追加してみる(MySQL)

次にデータを追加する実装です。

const mysql = require('mysql')

const conn = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: 'password',
    database: 'employee_db'
});

conn.connect((err) => {
    if (err) {
        console.log('connection failed. ' + err.stack);
        return;
    }
    console.log('connection success.');
});

conn.query('INSERT INTO users(id, department_id, email, first_name, last_name) VALUES (?,?,?,?,?)'
    , [5, '1', 'example@gmail.com', 'J.M', 'Weston'], (error, results) => {
    console.log(results);
})

実行すると下記に通りになります。

$ node insert_data_main.js 
connection success.
OkPacket {
  fieldCount: 0,
  affectedRows: 1,
  insertId: 5,
  serverStatus: 2,
  warningCount: 0,
  message: '',
  protocol41: true,
  changedRows: 0
}

・レコードを更新してみる(MySQL)

次にレコードを更新してみます。

const mysql = require('mysql')

const conn = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: 'password',
    database: 'employee_db'
});

conn.connect((err) => {
    if (err) {
        console.log('connection failed.' + err.stack());
        return;
    }
    console.log('connection success.');
})

conn.query('UPDATE users SET email=? where id=?',
    ['sample@gmail.com', 5], (error, results) => {
        console.log(results);
    }
);

console.log('updating data complited.');

実行結果はこちら

$ node update_data_main.js 
updating data complited.
connection success.
OkPacket {
  fieldCount: 0,
  affectedRows: 1,
  insertId: 0,
  serverStatus: 2,
  warningCount: 0,
  message: '(Rows matched: 1  Changed: 1  Warnings: 0',
  protocol41: true,
  changedRows: 1
}

・レコードを削除してみる(MySQL)

次にレコードを削除してみたいと思います。

const mysql = require('mysql')

const conn = mysql.createConnection({
    host: 'localhost',
    user: 'root',
    password: 'password',
    database: 'employee_db'
});

conn.connect((err) => {
    if (err) {
        console.log('connection establish is failed.' + err.stack());
        return;
    }
    console.log('connection established.');
});

conn.query('DELETE FROM users WHERE id=?',
  [5], (error, results) => {
    console.log(results);
  }
);

console.log('deleting data is success.');

実行結果は下記の通りです。

$ node delete_data_main.js 
deleting data is success.
connection established.
OkPacket {
  fieldCount: 0,
  affectedRows: 1,
  insertId: 0,
  serverStatus: 2,
  warningCount: 0,
  message: '',
  protocol41: true,
  changedRows: 0
}

・PostgreSQLに接続して参照してみる(PostgreSQL)

今度はpostgreSQLを使用して参照をしてみます。

Node.jsでPostgresSQLを使用するためのライブラリをインストールします。

npm install pg
npm upgrade pg

postgresSQLのセットアップは終わっているものとします。

const { Client } = require('pg')

const client = new Client({
    user: 'postgres',
    host: 'localhost',
    database: 'employee_db',
    password: 'postgres',
    port: 5432
})

client.connect();

const query = {
    text: 'SELECT * FROM users'
};

client.query(query, (err, res) => {
    if (err) {
        console.log(err.stack());
    } else {
        for (const row of res.rows) {
            console.log(row);
        }
    }
})

実行結果は下記となります。

$ node select_data_main.js 
{
  id: 1,
  email: 'sample@gmail.com',
  first_name: 'scott',
  last_name: 'hamilton'
}
{
  id: 2,
  email: 'example@gmail.com',
  first_name: 'John',
  last_name: 'Muffy'
}

・レコードを登録してみる(PostgresSQL)

次にレコードを登録してみます。

const { Client } = require('pg')

const client = new Client({
    user: 'postgres',
    host: 'localhost',
    database: 'employee_db',
    password: 'postgres',
    port: 5432
});

client.connect();

const query = {
    text: 'INSERT INTO users(id, email, first_name, last_name) VALUES($1, $2, $3, $4)',
    values: [3, 'fredrickson@gmail.com', 'fred', 'hopkins'],
};

client.query(query, (err, res) => {
    if (err) {
        console.log(err.stack());
        return;
    }
    console.log("insert success.");
});

実行結果は下記の通りです。

$ node insert_data_main.js 
insert success.

・レコードを更新してみる(PostgresSQL)

次にレコードを更新してみます。

const { Client } = require('pg')

const client = new Client({
    user: 'postgres',
    host: 'localhost',
    database: 'employee_db',
    password: 'postgres',
    port: 5432
});

client.connect();

const query = {
    text: 'UPDATE users SET email=$1 WHERE id=$2',
    values: ['babapapa@gmail.com', 3],
};

client.query(query, (err, res) => {

    if (err) {
        console.log(err.stack());
        return;
    }
    console.log('update success.');
});

実行結果はこちら

$ node update_data_main.js 
update success.

・レコードを削除してみる(PostgresSQL)

次にレコードを削除してみます。

const { Client } = require('pg')
const client = new Client({
    user: 'postgres',
    host: 'localhost',
    database: 'employee_db',
    password: 'postgres',
    port: 5432
})

client.connect();

const query = {
    text: 'DELETE FROM users WHERE id=$1',
    values: [3],
};

client.query(query, (err, res) => {

    if (err) {
        console.log(err.stack());
        return;
    }
    console.log('delete success.');
    console.log(res);
});

実行結果はこちら

$ node delete_data_main.js 
delete success.
Result {
  command: 'DELETE',
  rowCount: 1,
  oid: null,
  rows: [],
  fields: [],
  _parsers: undefined,
  _types: TypeOverrides {
    _types: {
      getTypeParser: [Function: getTypeParser],
      setTypeParser: [Function: setTypeParser],
      arrayParser: [Object],
      builtins: [Object]
    },
    text: {},
    binary: {}
  },
  RowCtor: null,
  rowAsArray: false,
  _prebuiltEmptyResultObject: null
}

Appendix

参考ドキュメントはこちら

https://qiita.com/shirokuman/items/509b159bf4b8dd1c41ef

https://stackoverflow.com/questions/49854811/class-extends-value-object-is-not-a-constructor-or-null

https://qiita.com/roomberry/items/71b1f9e7900cdee05f55

https://zenn.dev/ojk/articles/js-interface

https://www.geeksforgeeks.org/implementing-interfaces-in-javascript

https://stackoverflow.com/questions/3710275/does-javascript-have-the-interface-type-such-as-javas-interface

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Classes

https://qiita.com/IwashiMorino/items/41f1548bff0f27082ecc

https://qiita.com/harukin721/items/99c606364a012cceb0d8

https://prog-8.com/docs/nodejs-mysql

https://qiita.com/PianoScoreJP/items/7ed172cd0e7846641e13

https://qiita.com/yanbou893/items/a46b37f002df8529c99c

https://www.sejuku.net/blog/81358

https://enterprise.arcgis.com/ja/server/10.4/cloud/amazon/change-default-database-passwords-on-linux.htm

https://qiita.com/Shitimi_613/items/bcd6a7f4134e6a8f0621

https://postgresapp.com

https://zenn.dev/akkie1030/articles/js-loop-summary

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

*