- 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
| url.search
- URLオブジェクトのプロパティは、与えられたURLのさまざまな部分を取得したり設定したりするために使用することができます.
search
プロパティは、URLのシリアライズされたクエリ部分を取得および設定するために使用することができます.
searchParams
プロパティは、URLのクエリパラメータを表すURLSearchParams
オブジェクトを取得するために使用できますが、これは読み取り専用のプロパティです.
URLSearchParams
オブジェクトは URL インスタンスを変異させるために使用することができますが、クエリパラメータの全体を置き換えるために search
プロパティを使用することが推奨されます.
- API では、
urlObject
の query
プロパティを使用することができます.
const myURL = new URL('https://example.org/abc?123');
console.log(myURL.search);
myURL.search = 'abc=xyz';
console.log(myURL.href);
主要npmライブラリ
Lodash
- Lodashは、配列、オブジェクト、文字列の反復処理、値の操作とテスト、複合関数の作成を容易にするモジュール式メソッドを提供します.
- ライブラリの
_.isEqual()
メソッドを使用して、2 つのオブジェクト間でオブジェクト階層比較を行うことができます.
Axios
- ブラウザとNode.jsのためのプロミスベースのHTTPクライアント.
Express
- Node.jsのバックエンドフレームワークで、通常、受信したHTTPリクエストの処理に使用されます.
Webpack
Moment
- 日付の解析、検証、操作、書式設定に使用することができます.
Chalk
- 端末の文字列のスタイリングに使用されるライブラリです.
- 例えば、コンソールに色付きの情報メッセージを表示して、デバッグを容易にするために使用できます.
| Node.jsのpath
モジュール
const path = require('path');
const file = '/users/employees/james.txt';
path.parse(file).dir;
path.dirname(file);
parse
オブジェクトは色々下記のように取得できる.
const path = require('path');
const file = '/users/employees/james.txt';
console.log(path.parse(file).dir);
console.log(path.parse(file).root);
console.log(path.parse(file).base);
console.log(path.parse(file).name);
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.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
オブジェクトに追加プロパティとして追加します.
module.exports.getUsername = getUsername;
exports.getUsername = getUsername;
- デフォルトのエクスポート構文を使用する場合、新しい値を
exports
オブジェクトに代入する必要があります.
module.exports = User;
- インストールすると、受信したHTTPリクエストに対してNode.jsでルートをセットアップすることができます.
- ルーティングは、
app
オブジェクトのメソッドを使用して定義します.
app.get()
は、受信するGETリクエストの処理に使用されます.
rate/currencyPair
のcurrencyPair
のように、ルートがユーザーによって指定された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);
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()
- イベントハンドラを付けるために使えるもう一つのメソッドです.
- これは、
eventEmitter.on()
メソッドのエイリアスである.
const events = require('events');
const appEvents = new events.EventEmitter();
appEvents.on('started', function(data) {
});
appEvents.emit('started', 'App has started.');
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アプリでグローバル変数を宣言するには、その変数を
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
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);
console.log(path.dirname(file));
console.log(path.normalize(file).dir);