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);