' P '

whatever I will forget

Certified Javascript Developer Server Side JavaScript Section

Server Side JavaScript

package.json

  • package.jsonファイルは、他の人がアプリケーションを管理したりインストールしたりするのを簡単にするために、アプリケーションに追加されます.
  • 他の開発者が自分のシステムにアプリケーションをインストールしたい場合、npm install コマンドを使用すると、アプリケーションが依存するパッケージを自動的にインストールすることができます.
  • 必ずアプリケーションの名前とバージョンが含まれていなければなりません.
  • アプリケーションが依存する各パッケージが「dependencies」の下にリストアップされ、各パッケージのバージョンも含まれる.
  • ローカルでの開発とテストのために -save-dev を使ってインストールされたパッケージは devDependencies としてリストアップされます.

セマンティックバージョン (npmライブラリインストール時: バージョンコントロール)

  • チルダ ~ 文字を使用すると、同じマイナー範囲内の最新のパッケージバージョンをインストールできます.
  • ~2.2.0を使用すると、2.2.3、2.2.43、2.2.99などの2.2.0以上2.3.0未満の最新バージョンをインストールすることができます.
    • よって、2.2.1、2.2.2、2.2.3のバージョン選択肢があったとしても、インストールされるのは最新の2.2.3となります.
// package.json
{
  "name": "myAwesomeApp",
  "description": "",
  "version": "1.0.0",
  "dependencies": {
    "awesome-sf": "~2.2.0"
  }
}

blog.orz.at

npmコマンド

npm i

  • npm install のalias.

| url.search

  • URLオブジェクトのプロパティは、与えられたURLのさまざまな部分を取得したり設定したりするために使用することができます.
  • searchプロパティは、URLのシリアライズされたクエリ部分を取得および設定するために使用することができます.
  • searchParamsプロパティは、URLのクエリパラメータを表すURLSearchParamsオブジェクトを取得するために使用できますが、これは読み取り専用のプロパティです.
  • URLSearchParams オブジェクトは URL インスタンスを変異させるために使用することができますが、クエリパラメータの全体を置き換えるために search プロパティを使用することが推奨されます.
  • API では、urlObjectquery プロパティを使用することができます.
const myURL = new URL('https://example.org/abc?123');
console.log(myURL.search);
// Prints ?123

myURL.search = 'abc=xyz';
console.log(myURL.href);
// Prints https://example.org/abc?abc=xyz

主要npmライブラリ

Lodash

  • Lodashは、配列、オブジェクト、文字列の反復処理、値の操作とテスト、複合関数の作成を容易にするモジュール式メソッドを提供します.
  • ライブラリの _.isEqual() メソッドを使用して、2 つのオブジェクト間でオブジェクト階層比較を行うことができます.

Axios

  • ブラウザとNode.jsのためのプロミスベースのHTTPクライアント.

Express

Webpack

  • ブラウザで使用するためのJavaScriptファイルをバンドルするために使用されますが、画像、フォント、スタイルシートの変換、バンドル、パッケージ化も可能です.

Moment

  • 日付の解析、検証、操作、書式設定に使用することができます.

Chalk

  • 端末の文字列のスタイリングに使用されるライブラリです.
  • 例えば、コンソールに色付きの情報メッセージを表示して、デバッグを容易にするために使用できます.

| Node.jsのpathモジュール

const path = require('path');
const file = '/users/employees/james.txt';

path.parse(file).dir; // /users/employees
// OR
path.dirname(file); // /users/employees
  • parseオブジェクトは色々下記のように取得できる.
const path = require('path');
const file = '/users/employees/james.txt';

console.log(path.parse(file).dir);  // users/employees
console.log(path.parse(file).root); // /
console.log(path.parse(file).base); // james.txt
console.log(path.parse(file).name); // james

Node.jsのデバッグ

  • node inspect index.jsコマンドを使用してデバッグする.
  • node -debug index.jsコマンドは、Nodeの古いバージョンでのみ使用することができます。

V8 inspector integration for Node.js

  • 下記のコマンドを使用する.
$ node --inspect index.js
Debugger listening on ws://127.0.0.1:9229/dc9010dd-f8b8-4ac5-a510-c1a114ec7d29
For help, see: https://nodejs.org/en/docs/inspector

Breakpointのセット

  • setBreakpoint(line)またはsb(line)コマンドを使用して、コードの特定の行にブレークポイントを設定することができます.
  • watch(変数)コマンドは、指定された変数を監視するために使用することができます.
  • nextコマンドは、コードの次の行に進むために使用されます.
  • contコマンドは、コードの実行を継続するために使用されます.
  • stepコマンドは、関数呼び出しに入るために使用されます.
setBreakpoint(3), watch('user'), and next

Httpレスポンスを送信

コールバック関数

  • Postリクエストは、https.request()メソッドを使用してサーバーに送信することができます.
  • このメソッドは、パラメータとしてコールバック関数を受け付けます.
  • コールバック関数は、パラメータとしてresponseオブジェクトを受け取り、このオブジェクトにアクセスすることで、サーバーからレスポンスで送信されるデータを取得することができます.
  • データを受信したときにアクセスするには、response.on('data', callback)を使用することができます.
const https = require('node:https');

const options = {
  hostname: 'encrypted.google.com',
  port: 443,
  path: '/',
  method: 'GET',
};

const req = https.request(options, (res) => {
  console.log('statusCode:', res.statusCode);
  console.log('headers:', res.headers);

  res.on('data', (d) => {
    process.stdout.write(d);
  });
});

req.on('error', (e) => {
  console.error(e);
});
req.end();

|| レスポンス送信関数

  • http.ServerResponseクラスの下記メソッドをresponseで呼び出すことができる.

    writeHead()メソッド

  • リクエストに対するレスポンスヘッダーを送信するために使用されます.

    write()メソッド

  • レスポンスボディのチャンクを送信するために使用されます.

    end()メソッド

  • すべてのレスポンスヘッダーとボディの送信が完了したことをサーバーに知らせるために使用されます.

ファイルシステム: fs module

fs.appendFileSync()

  • ファイルの末尾にコンテンツを追加することができる関数.
  • 引数は、Path, データの順.
const userData = fs.readFileSync('/users/currentUser.json');
fs.appendFileSync('/users/employees.json', userData);
  • この関数は同期処理をしたい場合に使用.
  • 非同期で良い場合は、fs.appendFile()を使用する.

fs.readFileSync()

  • 同期的にファイルを読み込むことができる.
  • オプションとして、エンコーディングを指定することができます.

fs.writeFileSync()

  • 指定されたファイルに同期的にデータを書き込むために使用されます.
  • ファイルと書き込むべきデータの指定が必要です.
  • ファイルの既存の内容を置き換えます.

fs.appendFileSync()

  • データに対象データを追加する.
  • 追加するデータのパス、追加されるデータのパスが引数
fs.appendFileSync('/users/employees.json', userData);

モジュール管理のためのCommonJS標準

  • Node.jsはECMAScriptのモジュールをサポートしていますが、Node.jsの本来のモジュール形式はCommonJSです.
  • 関数、オブジェクト、クラスなどの機能をエクスポートするために、特別なexportsオブジェクトを使用する必要があります.
  • 関数をエクスポートするには、exportsオブジェクトに追加プロパティとして追加します.
// helper.js の getUsername() という名前の関数のエクスポート
// e.g. 1
module.exports.getUsername = getUsername; 
// e.g. 2
exports.getUsername = getUsername;
  • デフォルトのエクスポート構文を使用する場合、新しい値を exports オブジェクトに代入する必要があります.
// user.jsのUserクラスのデフォルトエクスポートに使用可能
module.exports = User;

Expressフレームワーク

  • インストールすると、受信したHTTPリクエストに対してNode.jsでルートをセットアップすることができます.
  • ルーティングは、appオブジェクトのメソッドを使用して定義します.
    • app.get()は、受信するGETリクエストの処理に使用されます.
  • rate/currencyPaircurrencyPairのように、ルートがユーザーによって指定された1つ以上のパラメータを含む場合は、コロン(:)を使用してルートで定義する必要があります.
  • 取り込んだルートパラメーターは、req.paramsオブジェクトに格納されます.
  • この場合、ルートは /rates/:currencyPair となり、 currencyPair パラメータには req.params.currencyPair でアクセスすることができる.
const express = require('express');
const app = express();

app.get('/rates/:currencyPair', async (req, res) => {
  const pair = req.params.currencyPair;
    try {
        const rate = await getRate(pair); // Function that gets the rate.
        if(!rate) {
            return res.status(404).send();
        }
        res.send(rate);
    } catch(e) {
        res.status(404).send();
    }
});

app.listen(8080, () => {
  console.log('App listening at 8080.');
});

イベント

eventEmitter.emit()

  • イベントを発生させるには、eventEmitter.emit()メソッドを使用します.
  • このメソッドでは、イベント名と追加のパラメータを引数として受け取ります.

nodejs.org.

eventEmitter.on()

  • メソッドを使用すると、指定したイベントを処理するイベントハンドラを追加することができます.
  • このメソッドは、イベント名とコールバック関数を引数として受け取る.
  • コールバック関数は、イベントに渡される引数を受け取ります.

eventEmitter.addListener()

const events = require('events');
const appEvents = new events.EventEmitter();

appEvents.on('started', function(data) {
  // implementation
});

// Implementation of application

// Send custom event.
appEvents.emit('started', 'App has started.');

Jest テストフレームワーク

  • npm startコマンドは、package.jsonファイルのscriptsオブジェクトのstartプロパティで指定されているコマンドを実行するために使用されます.
  • 例では、startプロパティの値としてnode main.jsコマンドが指定されており、アプリのmain.jsファイルが実行されます.
  • npm run <command> コマンドは、scripts オブジェクトのプロパティとして追加された指定コマンドを実行するために使用されます.
  • この場合、ターミナルで npm run test コマンドを実行すると、 scripts オブジェクトの test プロパティの値として追加された jest コマンドを実行することができます。
npm start, npm run test
"scripts": {
    "start": "node main.js",
    "test": "jest"
}

Node.js: グローバル変数

  • Node.jsアプリでグローバル変数を宣言するには、その変数をglobalオブジェクトのプロパティとして定義します.
  • グローバル変数の値には、global キーワードを使わずにアクセスすることができる.
    • 例えば、global.time の代わりに time を使うことができるが、この方法は、グローバル変数として宣言せずに、他のファイル内から変数にアクセスするために使用することはできない。
let counter = 0;
global.time = 1000;
global.limit = 5;

setInterval(async () => {
   counter++;
   if(counter <= global.limit) {
      const data = await sendLatestData();
      console.log(data);
   } 
}, global.time);

環境変数

下記のような要件がある場合

  • npm install コマンドを使用しても開発用の依存関係が本番環境にインストールされないようにしたい場合.
  • アプリが本番環境の準備ができたときに、環境変数を使用してモードを production に設定したい.
  • productionに設定されている場合、--devフラグを付けずにnpm installコマンドを実行しても、開発用の依存関係はインストールされないようにしたい.

解決策

  • NODE_ENVという環境変数を使用して、どの機能を有効または無効にするかを決定するアプリケーションモードを設定する.
  • productionに設定されている場合、npm installコマンドを使用しても、-devフラグなしでdevの依存関係はインストールされない.
  • LinuxまたはMac OSを使用している場合は、以下のコマンドを使用して変数の値を「production」に設定することができる:
export NODE_ENV=production
  • Windows OSの場合は、次のコマンドを使用する:
env:NODE_ENV = 'production'
  • Node.jsのコードでは、process.env.NODE_ENVを使って変数の値にアクセスできる.

Pathを取得したい

  • ファイル名は不要な場合
const path = require('path');
const file = '/users/employees/james.txt';

console.log(path.parse(file).dir); // /users/employees/
console.log(path.dirname(file)); // /users/employees/
//console.log(path.dir(file)); → このメソッドは存在しない
console.log(path.normalize(file).dir); // undefined