Node.js初心者 チートシート

サーバーサイドJavaScriptの基礎リファレンス

Node.jsとは?

Node.jsは、ChromeのV8 JavaScriptエンジン上に構築されたサーバーサイドJavaScript実行環境です。非同期I/Oとイベント駆動アーキテクチャにより、高速で効率的なWebアプリケーション開発を実現します。

サーバーサイド 非同期処理 npm Express

基本的な実行

Node.jsファイルを実行

node app.js

対話型モード (REPL)

node
> console.log("Hello, Node.js!")
> .exit

Hello World (app.js)

console.log("Hello, Node.js!");
console.log("Node version:", process.version);

モジュールシステム

CommonJS (require)

// モジュールのエクスポート (utils.js)
module.exports = {
    add: (a, b) => a + b,
    multiply: (a, b) => a * b
};

// モジュールのインポート (app.js)
const utils = require('./utils');
console.log(utils.add(2, 3)); // 5

ES Modules (import)

// utils.mjs または package.json に "type": "module"
export const add = (a, b) => a + b;
export const multiply = (a, b) => a * b;

// app.mjs
import { add, multiply } from './utils.mjs';
console.log(add(2, 3)); // 5

package.jsonに"type": "module"を追加すると、.jsファイルでES Modulesが使えます

npm基本操作

package.json作成

npm init -y

パッケージインストール

# 本番依存関係
npm install express

# 開発依存関係
npm install --save-dev nodemon

# グローバルインストール
npm install -g typescript

パッケージ削除

npm uninstall express

依存関係インストール

npm install

パッケージ更新

npm update

スクリプト実行

npm run [script]

パッケージ検索

npm search express

非同期処理パターン

Promise

const fs = require('fs').promises;

fs.readFile('data.txt', 'utf-8')
  .then(data => console.log(data))
  .catch(err => console.error(err));

async/await (推奨)

const fs = require('fs').promises;

async function readData() {
  try {
    const data = await fs.readFile('data.txt', 'utf-8');
    console.log(data);
  } catch (err) {
    console.error(err);
  }
}

readData();

async/awaitは可読性が高く、エラーハンドリングがしやすいため、現代的なNode.js開発では推奨されています

よく使う組み込みモジュール

fs - ファイルシステム

const fs = require('fs').promises;

// ファイル読み込み
const data = await fs.readFile('file.txt', 'utf-8');

// ファイル書き込み
await fs.writeFile('output.txt', 'Hello');

path - パス操作

const path = require('path');

path.join('/users', 'john', 'file.txt');
// '/users/john/file.txt'

path.basename('/users/john/file.txt');
// 'file.txt'

http - HTTPサーバー

const http = require('http');

const server = http.createServer((req, res) => {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
});

server.listen(3000);

os - OS情報

const os = require('os');

console.log(os.platform()); // 'darwin', 'win32'
console.log(os.arch());     // 'x64', 'arm64'
console.log(os.cpus().length); // CPUコア数

Express.js基本パターン

基本セットアップ

const express = require('express');
const app = express();

// JSONボディパーサー
app.use(express.json());

// ルート定義
app.get('/', (req, res) => {
  res.send('Hello Express!');
});

app.listen(3000, () => {
  console.log('Server running on port 3000');
});

ルーティング

// GETリクエスト
app.get('/users', (req, res) => {
  res.json({ users: [] });
});

// POSTリクエスト
app.post('/users', (req, res) => {
  const user = req.body;
  res.status(201).json(user);
});

// URLパラメータ
app.get('/users/:id', (req, res) => {
  const id = req.params.id;
  res.json({ id });
});

ミドルウェア

// グローバルミドルウェア
app.use((req, res, next) => {
  console.log(`${req.method} ${req.path}`);
  next();
});

// ルート固有ミドルウェア
const auth = (req, res, next) => {
  if (req.headers.authorization) {
    next();
  } else {
    res.status(401).json({ error: 'Unauthorized' });
  }
};

app.get('/admin', auth, (req, res) => {
  res.send('Admin page');
});

エラーハンドリング

// 404エラー
app.use((req, res) => {
  res.status(404).json({ error: 'Not Found' });
});

// グローバルエラーハンドラ
app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).json({
    error: 'Internal Server Error'
  });
});

実務で役立つTips

nodemon

ファイル変更を自動検知して再起動

npm i -D nodemon
npx nodemon app.js

dotenv

環境変数を.envファイルから読み込み

npm i dotenv
require('dotenv').config();

CORS対応

クロスオリジンリクエストを許可

npm i cors
app.use(cors());

デバッグ

VS Codeでデバッグ実行

node --inspect app.js
F5でアタッチ

よく使うファイル操作

ファイルの読み書き

const fs = require('fs').promises;

// ファイル読み込み
const data = await fs.readFile('data.txt', 'utf-8');

// ファイル書き込み
await fs.writeFile('output.txt', data);

// ファイル追記
await fs.appendFile('log.txt', 'New log\n');

ディレクトリ操作

const fs = require('fs').promises;

// ディレクトリ作成
await fs.mkdir('uploads', { recursive: true });

// ファイル一覧取得
const files = await fs.readdir('./data');

// ファイル/ディレクトリ削除
await fs.rm('temp.txt');
await fs.rm('uploads', { recursive: true });

JSONファイル操作

const fs = require('fs').promises;

// JSON読み込み
const json = await fs.readFile('data.json', 'utf-8');
const data = JSON.parse(json);

// JSON書き込み
const output = JSON.stringify(data, null, 2);
await fs.writeFile('output.json', output);

ストリーム処理(大容量)

const fs = require('fs');

// ファイルコピー(ストリーム)
const readStream = fs.createReadStream('large.txt');
const writeStream = fs.createWriteStream('copy.txt');

readStream.pipe(writeStream);

writeStream.on('finish', () => {
  console.log('Copy completed');
});

package.jsonスクリプト例

{
  "name": "my-nodejs-app",
  "version": "1.0.0",
  "description": "My Node.js Application",
  "main": "app.js",
  "scripts": {
    "start": "node app.js",
    "dev": "nodemon app.js",
    "test": "jest",
    "lint": "eslint ."
  },
  "dependencies": {
    "express": "^4.18.0",
    "dotenv": "^16.0.0"
  },
  "devDependencies": {
    "nodemon": "^3.0.0",
    "jest": "^29.0.0"
  }
}

本番実行

npm start

開発実行

npm run dev

テスト実行

npm test

Lint実行

npm run lint

環境変数とプロセス情報

環境変数アクセス

// 環境変数取得
const port = process.env.PORT || 3000;
const dbUrl = process.env.DATABASE_URL;

// .envファイルを使う場合
require('dotenv').config();
console.log(process.env.API_KEY);

.env

PORT=3000
DATABASE_URL=mongodb://localhost

プロセス情報

// Node.jsバージョン
console.log(process.version); // v18.17.0

// プラットフォーム
console.log(process.platform); // darwin, win32

// カレントディレクトリ
console.log(process.cwd());

// コマンドライン引数
console.log(process.argv);