12月 21, 2025
43 分で読める

Node.js バックエンド開発者(ジュニア)面接対策:完全ガイド

interview
career-advice
job-search
entry-level
Node.js バックエンド開発者(ジュニア)面接対策:完全ガイド
MB

Milad Bonakdar

著者

JavaScriptの基礎、非同期処理、Express.js、データベース、API、セキュリティなど、Node.jsバックエンド開発に不可欠な35の面接質問をマスターしましょう。ジュニアバックエンド開発者の面接対策に最適です。


はじめに

この包括的なガイドでは、Node.jsのバックエンド開発の基礎を網羅する、厳選された35の面接質問を掲載しています。これらは、ジュニアバックエンド開発者が実際の面接で遭遇する可能性のある質問です。各質問には、主要なテクノロジー企業やスタートアップの何百もの実際の面接の分析に基づいた、詳細な回答、希少性評価、および難易度評価が含まれています。

初めてのバックエンドの役割を準備している場合でも、フロントエンド開発から移行する場合でも、このガイドはJavaScriptの基礎からAPI設計、データベース管理、セキュリティのベストプラクティス、およびデプロイ戦略まで、すべてを網羅しています。


JavaScriptの基礎 (8つの質問)

1. JavaScriptにおける varlet、および const の違いを説明してください。

回答:

  • var: 関数スコープ、巻き上げられ undefined で初期化される、同じスコープ内で再宣言可能、現代のコードではほぼ非推奨
  • let: ブロックスコープ、巻き上げられるが宣言まで一時的なデッドゾーン(TDZ)に残る、同じスコープ内で再宣言不可、再割り当て可能
  • const: ブロックスコープ、TDZで巻き上げられる、宣言時に初期化する必要がある、再割り当て不可(ただし、オブジェクト/配列の内容は変更可能)

例:

// var - 関数スコープ
function example() {
  if (true) {
    var x = 1;
  }
  console.log(x); // 1 (ブロック外からアクセス可能)
}

// let - ブロックスコープ
if (true) {
  let y = 2;
}
console.log(y); // ReferenceError

// const - 再割り当て不可
const z = 3;
z = 4; // TypeError

const obj = { name: 'John' };
obj.name = 'Jane'; // OK - プロパティの変更
obj = {}; // TypeError - 再割り当て不可

ベストプラクティス: デフォルトで const を使用し、再割り当てが必要な場合は let を使用し、現代のJavaScriptでは var を絶対に使用しないでください。

希少性: 一般的 難易度: 簡単


2. クロージャとは何ですか?また、Node.jsでの実践的な例を挙げてください。

回答: クロージャとは、内側の関数が、外側の(囲んでいる)関数のスコープからの変数に、外側の関数が返された後でもアクセスできることです。内側の関数は、これらの変数を「クローズオーバー」します。

Node.jsの実践的な例:

// ミドルウェアファクトリーパターン
function createAuthMiddleware(secretKey) {
  // secretKey は返された関数によって「クローズオーバー」される
  return function(req, res, next) {
    const token = req.headers.authorization;
    if (validateToken(token, secretKey)) {
      next();
    } else {
      res.status(401).json({ error: 'Unauthorized' });
    }
  };
}

// 使用法
const authMiddleware = createAuthMiddleware(process.env.JWT_SECRET);
app.use('/api/protected', authMiddleware);

利点:

  • データのプライバシー(secretKey に直接アクセスできない)
  • 関数ファクトリー
  • モジュールパターンの実装
  • 非同期操作での状態の維持

希少性: 一般的 難易度: 中程度


3. this キーワードと、アロー関数での違いを説明してください。

回答: this は実行コンテキストを参照します。その値は、関数がどのように呼び出されるかによって異なります。

通常の関数:

const obj = {
  name: "Server",
  greet: function() {
    console.log(this.name); // "Server"
  }
};
obj.greet(); // this = obj

const greet = obj.greet;
greet(); // this = undefined (strict mode) または global

アロー関数:

const obj = {
  name: "Server",
  greet: () => {
    console.log(this.name); // undefined (レキシカルスコープ)
  }
};
obj.greet(); // this = レキシカルスコープ (Node.jsではモジュールスコープ)

重要な違い: アロー関数は独自の this を持たず、囲んでいるスコープから継承します。

希少性: 一般的 難易度: 中程度


4. Promiseとは何ですか?また、コールバックとの違いは何ですか?

回答: Promiseは、非同期操作の最終的な完了(または失敗)を表します。

コールバックパターン(コールバック地獄):

getUser(userId, (err, user) => {
  if (err) return handleError(err);
  getPosts(user.id, (err, posts) => {
    if (err) return handleError(err);
    getComments(posts[0].id, (err, comments) => {
      if (err) return handleError(err);
      // ネストされたコールバック - 読みにくい
    });
  });
});

Promiseパターン:

getUser(userId)
  .then(user => getPosts(user.id))
  .then(posts => getComments(posts[0].id))
  .then(comments => console.log(comments))
  .catch(err => handleError(err));

利点:

  • コールバック地獄の回避
  • .catch() によるより良いエラー処理
  • チェーン可能な操作
  • Promise.all() を使用して並列操作が可能

希少性: 一般的 難易度: 簡単〜中程度


5. async/awaitとは何ですか?また、どのようにコードの可読性を向上させますか?

回答: async/await はPromise上に構築された糖衣構文で、非同期コードを同期コードのように見せ、動作させます。

例:

// Promiseを使用
function fetchUserData(userId) {
  return fetchUser(userId)
    .then(user => {
      return fetchPosts(user.id)
        .then(posts => {
          return { user, posts };
        });
    })
    .catch(error => console.error(error));
}

// async/awaitを使用 (よりクリーン)
async function fetchUserData(userId) {
  try {
    const user = await fetchUser(userId);
    const posts = await fetchPosts(user.id);
    return { user, posts };
  } catch (error) {
    console.error(error);
  }
}

重要なポイント:

  • async 関数は常にPromiseを返します
  • await はPromiseが解決するまで実行を一時停止します
  • エラー処理には try/catch を使用します
  • 順次操作をより明確にします

希少性: 一般的 難易度: 中程度


6. オブジェクトと配列の分割代入について説明してください。

回答: 分割代入は、配列から値、またはオブジェクトからプロパティを個別の変数に抽出します。

配列の分割代入:

const [first, second, ...rest] = [1, 2, 3, 4, 5];
// first = 1, second = 2, rest = [3, 4, 5]

// 要素のスキップ
const [primary, , tertiary] = ['red', 'green', 'blue'];
// primary = 'red', tertiary = 'blue'

オブジェクトの分割代入:

const user = { name: 'Alice', age: 25, email: '[email protected]' };

const { name, age, city = 'NYC' } = user;
// name = 'Alice', age = 25, city = 'NYC' (デフォルト値)

// 変数の名前を変更
const { name: userName, age: userAge } = user;

// ネストされた分割代入
const { address: { street, zip } } = person;

関数のパラメータ:

function createUser({ name, email, role = 'user' }) {
  // 分割代入されたパラメータを使用
}

希少性: 一般的 難易度: 簡単〜中程度


7. スプレッド演算子とレストパラメータとは何ですか?

回答:

スプレッド演算子 (...) - イテラブルを展開します:

// 配列
const arr1 = [1, 2, 3];
const arr2 = [...arr1, 4, 5]; // [1, 2, 3, 4, 5]

// オブジェクト (shallow copy)
const user = { name: 'Alice', age: 25 };
const updatedUser = { ...user, age: 26 }; // Immutable update

// 関数の引数
const numbers = [1, 2, 3];
Math.max(...numbers); // 3

レストパラメータ (...) - 複数の要素を収集します:

// 関数のパラメータ
function sum(...numbers) {
  return numbers.reduce((a, b) => a + b, 0);
}
sum(1, 2, 3, 4); // 10

// 配列の分割代入
const [first, ...remaining] = [1, 2, 3, 4];
// first = 1, remaining = [2, 3, 4]

重要な違い: スプレッドは展開し、レストは収集します。

希少性: 一般的 難易度: 簡単〜中程度


8. 一般的な配列メソッド(map、filter、reduce、forEach)について説明してください。

回答:

map - 各要素を変換し、新しい配列を返します:

const doubled = [1, 2, 3].map(x => x * 2); // [2, 4, 6]

filter - 条件に一致する要素を保持します:

const evens = [1, 2, 3, 4].filter(x => x % 2 === 0); // [2, 4]

reduce - 単一の値に縮小します:

const sum = [1, 2, 3].reduce((acc, val) => acc + val, 0); // 6
const grouped = users.reduce((acc, user) => {
  acc[user.role] = acc[user.role] || [];
  acc[user.role].push(user);
  return acc;
}, {});

forEach - 新しい配列を返さずにイテレートします:

[1, 2, 3].forEach(item => console.log(item));

希少性: 一般的 難易度: 簡単


Node.jsの基礎 (7つの質問)

9. Node.jsとは何ですか?また、従来のサーバーサイド言語とどのように異なりますか?

回答: Node.jsは、ChromeのV8 JavaScriptエンジン上に構築されたJavaScriptランタイムであり、JavaScriptをサーバーサイドで実行できます。

主な違い:

  • シングルスレッドイベントループ: マルチスレッドのブロッキングI/Oではなく、ノンブロッキングI/Oモデルを使用
  • デフォルトで非同期: 操作はメインスレッドをブロックしません
  • JavaScript everywhere: フロントエンドとバックエンドで同じ言語
  • NPMエコシステム: 世界最大のパッケージレジストリ
  • 高速実行: V8エンジンはJavaScriptをネイティブマシンコードにコンパイル

Node.jsを使用するタイミング:

  • リアルタイムアプリケーション(チャット、ゲーム)
  • APIサーバー
  • マイクロサービス
  • データストリーミングアプリケーション
  • I/O集中型アプリケーション

使用しないタイミング:

  • CPU集中型タスク(画像処理、ビデオエンコーディング)
  • 複雑な計算を必要とするアプリケーション

希少性: 一般的 難易度: 簡単〜中程度


10. Node.jsのイベントループについて説明してください。

回答: イベントループは、シングルスレッドであるにもかかわらず、Node.jsがノンブロッキングI/O操作を実行できるようにするメカニズムです。

仕組み:

  1. コールスタック: 同期コードを実行(LIFO)
  2. Node APIs: 非同期操作を処理(fs、http、timers)
  3. コールバックキュー(マクロタスク): Node APIからのコールバックを保持
  4. マイクロタスクキュー: Promiseコールバックを保持(優先度が高い)
  5. イベントループ: スタックが空のときに、キューからコールスタックにタスクを移動

実行順序:

console.log('1');

setTimeout(() => console.log('2'), 0);

Promise.resolve().then(() => console.log('3'));

console.log('4');

// 出力: 1, 4, 3, 2
// 説明:
// - 同期コード (1, 4) が最初に実行される
// - マイクロタスク (Promise) はマクロタスクより前に実行される
// - マクロタスク (setTimeout) は最後に実行される

イベントループのフェーズ:

  1. タイマー (setTimeout, setInterval)
  2. 保留中のコールバック
  3. アイドル、準備
  4. ポール (新しい I/O イベントのフェッチ)
  5. チェック (setImmediate コールバック)
  6. クローズコールバック

希少性: 一般的 難易度: 難しい


11. ブロッキングコードとノンブロッキングコードの違いは何ですか?

回答:

ブロッキングコード - 操作が完了するまで実行を停止します:

// 同期ファイル読み込み (ブロッキング)
const fs = require('fs');
const data = fs.readFileSync('file.txt', 'utf8');
console.log(data); // ファイル読み込みを待つ
console.log('Done'); // ファイル読み込み後に実行

ノンブロッキングコード - 実行を継続し、コールバックを介して結果を処理します:

// 非同期ファイル読み込み (ノンブロッキング)
const fs = require('fs');
fs.readFile('file.txt', 'utf8', (err, data) => {
  if (err) throw err;
  console.log(data);
});
console.log('Done'); // ファイル読み込みが完了する前にすぐに実行

ノンブロッキングが重要な理由:

  • サーバーは複数のリクエストを同時に処理できます
  • より良いリソース利用率
  • I/O操作のパフォーマンスの向上
  • スケーラビリティ

希少性: 一般的 難易度: 簡単〜中程度


12. Node.jsモジュールとは何ですか?また、モジュールシステムはどのように機能しますか?

回答: Node.jsはCommonJSモジュールシステムを使用します(ただし、ESモジュールもサポートされています)。

CommonJS (require/module.exports):

// math.js
function add(a, b) {
  return a + b;
}

module.exports = { add };
// または
exports.add = add;

// app.js
const { add } = require('./math');
const result = add(2, 3);

ES Modules (import/export):

// math.js
export function add(a, b) {
  return a + b;
}

// app.js
import { add } from './math.js';

モジュールの種類:

  • コアモジュール: 組み込み (fs, http, path)
  • ローカルモジュール: 独自のファイル
  • サードパーティモジュール: npm経由でインストール

モジュールのキャッシュ: モジュールは最初のrequireの後にキャッシュされるため、後続のrequireは同じインスタンスを返します。

希少性: 一般的 難易度: 簡単


13. process.nextTick()setImmediate() の違いを説明してください。

回答:

process.nextTick() - 他の非同期操作の前に、現在のフェーズでコールバックを実行します:

console.log('1');

process.nextTick(() => {
  console.log('2');
});

Promise.resolve().then(() => {
  console.log('3');
});

console.log('4');

// 出力: 1, 4, 2, 3
// nextTick は Promise よりも優先度が高い

setImmediate() - イベントループの次のイテレーションでコールバックを実行します:

console.log('1');

setImmediate(() => {
  console.log('2');
});

setTimeout(() => {
  console.log('3');
}, 0);

console.log('4');

// 出力: 1, 4, 3, 2 (または 1, 4, 2, 3 コンテキストによって異なる)

優先順位:

  1. 同期コード
  2. process.nextTick() コールバック
  3. Promiseコールバック (マイクロタスク)
  4. setTimeout(0) / setImmediate() (マクロタスク)

ユースケース:

  • nextTick: コールバックが他の非同期操作の前に実行されるようにする
  • setImmediate: 実行を次のイベントループイテレーションに延期する

希少性: まれ 難易度: 中〜難しい


14. Node.jsのグローバルオブジェクトとは何ですか?

回答: Node.jsのグローバルオブジェクトは、ブラウザの window オブジェクトに似ていますが、global と呼ばれます。

グローバルプロパティ:

// requireなしでどこでも利用可能
console.log(__dirname); // 現在のディレクトリパス
console.log(__filename); // 現在のファイルパス
console.log(process); // Processオブジェクト
console.log(global); // グローバルオブジェクト自体

一般的なグローバル:

  • process - プロセス情報と制御
  • Buffer - バイナリデータを処理
  • setTimeout, setInterval, clearTimeout, clearInterval
  • setImmediate, clearImmediate
  • console - コンソール出力

注: ESモジュールでは、__dirname__filename はデフォルトでは利用できません。代わりに import.meta.url を使用してください。

希少性: 一般的 難易度: 簡単


15. Node.jsアプリケーションでエラーをどのように処理しますか?

回答: Node.jsでのエラー処理は、複数のアプローチで管理できます。

1. 同期コードのtry-catch:

try {
  const data = fs.readFileSync('file.txt', 'utf8');
} catch (error) {
  console.error('Error reading file:', error.message);
}

2. コールバックエラーパターン:

fs.readFile('file.txt', 'utf8', (err, data) => {
  if (err) {
    return console.error('Error:', err);
  }
  console.log(data);
});

3. Promiseエラー処理:

fetchData()
  .then(data => processData(data))
  .catch(error => console.error('Error:', error));

4. async/await と try-catch:

async function handleRequest() {
  try {
    const data = await fetchData();
    return data;
  } catch (error) {
    console.error('Error:', error);
    throw error; // 必要に応じて再スロー
  }
}

5. グローバルエラーハンドラー:

// キャッチされない例外
process.on('uncaughtException', (error) => {
  console.error('Uncaught Exception:', error);
  process.exit(1);
});

// 処理されない Promise rejection
process.on('unhandledRejection', (reason, promise) => {
  console.error('Unhandled Rejection:', reason);
});

6. Expressエラーミドルウェア:

app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).json({ error: 'Something went wrong!' });
});

希少性: 一般的 難易度: 中程度


Express.js と Webフレームワーク (6つの質問)

16. Express.jsとは何ですか?また、その主な機能は何ですか?

回答: Express.jsは、Webおよびモバイルアプリケーションを構築するための堅牢な機能セットを提供する、最小限で柔軟なNode.js Webアプリケーションフレームワークです。

主な機能:

  • ルーティング: エンドポイントとHTTPメソッドを定義
  • ミドルウェア: リクエスト-レスポンスサイクル中に実行される関数
  • テンプレートエンジン: 動的なHTMLをレンダリング (EJS, Pug, Handlebars)
  • エラー処理: 集中型エラー処理ミドルウェア
  • 静的ファイル: 静的アセットを提供する
  • JSON解析: JSONおよびURLエンコードされたデータの組み込みボディ解析

基本的な例:

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

app.use(express.json());

app.get('/', (req, res) => {
  res.json({ message: 'Hello World' });
});

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

Expressを使用する理由:

  • 最小限で独断的でない
  • 大きなエコシステム
  • 学習しやすい
  • 柔軟なミドルウェアシステム

希少性: 一般的 難易度: 簡単


17. Express.jsのミドルウェアとは何ですか?例を挙げてください。

回答: ミドルウェア関数は、アプリケーションのリクエスト-レスポンスサイクルで、リクエストオブジェクト(req)、レスポンスオブジェクト(res)、および next 関数にアクセスできる関数です。

ミドルウェアの種類:

1. アプリケーションレベルのミドルウェア:

app.use((req, res, next) => {
  console.log('Request received:', req.method, req.path);
  next(); // 次のミドルウェアに制御を渡す
});

2. ルートレベルのミドルウェア:

app.get('/users', authenticateUser, (req, res) => {
  res.json({ users: [] });
});

3. エラー処理ミドルウェア:

app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).json({ error: err.message });
});

4. 組み込みミドルウェア:

app.use(express.json()); // JSONボディを解析
app.use(express.urlencoded({ extended: true })); // URLエンコードされたデータを解析
app.use(express.static('public')); // 静的ファイルを提供する

5. サードパーティミドルウェア:

const cors = require('cors');
const helmet = require('helmet');

app.use(cors());
app.use(helmet());

カスタム認証ミドルウェアの例:

function authenticateUser(req, res, next) {
  const token = req.headers.authorization;
  if (!token) {
    return res.status(401).json({ error: 'No token provided' });
  }
  // トークンを検証
  req.user = decodedToken;
  next();
}

希少性: 一般的 難易度: 中程度


18. Expressルーティングとルートの整理方法について説明してください。

回答: ルーティングとは、アプリケーションのエンドポイント(URI)がクライアントのリクエストにどのように応答するかを指します。

基本的なルーティング:

app.get('/users', (req, res) => {
  res.json({ users: [] });
});

app.post('/users', (req, res) => {
  const newUser = req.body;
  res.status(201).json(newUser);
});

app.get('/users/:id', (req, res) => {
  const userId = req.params.id;
  res.json({ user: { id: userId } });
});

app.put('/users/:id', (req, res) => {
  // ユーザーを更新
});

app.delete('/users/:id', (req, res) => {
  // ユーザーを削除
});

ルートパラメータ:

app.get('/users/:userId/posts/:postId', (req, res) => {
  const { userId, postId } = req.params;
  // ルートパラメータにアクセス
});

クエリパラメータ:

app.get('/search', (req, res) => {
  const { q, page, limit } = req.query;
  // ?q=nodejs&page=1&limit=10
});

Express Routerによるルートの整理:

// routes/users.js
const express = require('express');
const router = express.Router();

router.get('/', (req, res) => {
  res.json({ users: [] });
});

router.get('/:id', (req, res) => {
  res.json({ user: { id: req.params.id } });
});

module.exports = router;

// app.js
const userRoutes = require('./routes/users');
app.use('/api/users', userRoutes);

希少性: 一般的 難易度: 簡単〜中程度


19. Expressでファイルのアップロードをどのように処理しますか?

回答: ファイルのアップロードは、multerのようなミドルウェアを使用して処理できます。

基本的なファイルのアップロード:

const multer = require('multer');
const upload = multer({ dest: 'uploads/' });

app.post('/upload', upload.single('file'), (req, res) => {
  // req.file にファイル情報が含まれる
  res.json({ 
    filename: req.file.filename,
    originalname: req.file.originalname,
    size: req.file.size
  });
});

複数のファイル:

app.post('/upload-multiple', upload.array('files', 10), (req, res) => {
  // req.files はファイルの配列
  res.json({ uploaded: req.files.length });
});

カスタムストレージ構成:

const storage = multer.diskStorage({
  destination: (req, file, cb) => {
    cb(null, 'uploads/');
  },
  filename: (req, file, cb) => {
    const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9);
    cb(null, file.fieldname + '-' + uniqueSuffix);
  }
});

const upload = multer({ 
  storage: storage,
  limits: { fileSize: 5 * 1024 * 1024 }, // 5MB制限
  fileFilter: (req, file, cb) => {
    if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png') {
      cb(null, true);
    } else {
      cb(new Error('Only JPEG and PNG allowed'));
    }
  }
});

希少性: 一般的 難易度: 中程度


20. CORSとは何ですか?また、Expressでどのように処理しますか?

回答: CORS(Cross-Origin Resource Sharing)は、WebページがWebページを提供しているドメインとは異なるドメインにリクエストを行うことを許可または制限するセキュリティ機能です。

問題: ブラウザは、デフォルトで http://localhost:3000 から http://localhost:4000 へのリクエストをブロックします(異なるオリジン)。

corsミドルウェアによる解決策:

const cors = require('cors');

// すべてのオリジンを許可 (開発環境のみ)
app.use(cors());

// 特定のオリジンを構成
app.use(cors({
  origin: 'https://example.com',
  methods: ['GET', 'POST', 'PUT', 'DELETE'],
  allowedHeaders: ['Content-Type', 'Authorization']
}));

// 複数のオリジン
app.use(cors({
  origin: ['https://example.com', 'https://app.example.com']
}));

手動CORSヘッダー:

app.use((req, res, next) => {
  res.header('Access-Control-Allow-Origin', 'https://example.com');
  res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE');
  res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
  
  if (req.method === 'OPTIONS') {
    return res.sendStatus(200);
  }
  next();
});

希少性: 一般的 難易度: 簡単〜中程度


21. 大規模なExpress.jsアプリケーションをどのように構造化しますか?

回答: メンテナンス性を高めるために、コードを論理的なモジュールとフォルダに整理します。

推奨される構造:

project/
├── src/
│   ├── controllers/
│   │   └── userController.js
│   ├── models/
│   │   └── User.js
│   ├── routes/
│   │   └── userRoutes.js
│   ├── middleware/
│   │   └── auth.js
│   ├── services/
│   │   └── userService.js
│   ├── utils/
│   │   └── helpers.js
│   ├── config/
│   │   └── database.js
│   └── app.js
├── tests/
├── .env
└── package.json

関心の分離の例:

コントローラー (HTTPを処理):

// controllers/userController.js
const userService = require('../services/userService');

exports.getUsers = async (req, res, next) => {
  try {
    const users = await userService.getAllUsers();
    res.json(users);
  } catch (error) {
    next(error);
  }
};

サービス (ビジネスロジック):

// services/userService.js
const User = require('../models/User');

exports.getAllUsers = async () => {
  return await User.find();
};

ルート:

// routes/userRoutes.js
const express = require('express');
const router = express.Router();
const userController = require('../controllers/userController');

router.get('/', userController.getUsers);
router.post('/', userController.createUser);

module.exports = router;

アプリのセットアップ:

// app.js
const express = require('express');
const userRoutes = require('./routes/userRoutes');

const app = express();
app.use(express.json());
app.use('/api/users', userRoutes);

希少性: 一般的 難易度: 中程度


データベースの概念 (5つの質問)

22. SQLデータベースとNoSQLデータベースの違いは何ですか?

回答:

SQL (リレーショナル) データベース:

  • テーブル、行、列で構成された構造化データ
  • 使用前にスキーマを定義する必要がある
  • ACID準拠 (Atomicity, Consistency, Isolation, Durability)
  • 例: PostgreSQL, MySQL, SQLite
  • 最適な用途: 複雑なクエリ、トランザクション、構造化データ

NoSQLデータベース:

  • 柔軟なスキーマまたはスキーマレス
  • さまざまなデータモデル (ドキュメント、キーバリュー、グラフ、カラム)
  • 水平方向のスケーリング
  • 例: MongoDB, Redis, Cassandra
  • 最適な用途: 大規模アプリケーション、柔軟なスキーマ、迅速な開発

比較:

機能SQLNoSQL
スキーマ固定柔軟
スケーラビリティ垂直水平
ACIDはいさまざま
クエリ言語SQLさまざま
関係ジョイン埋め込み/参照

SQLを使用するタイミング:

  • 複雑なクエリと関係
  • ACID準拠が必要
  • 構造化データ
  • 金融取引

NoSQLを使用するタイミング:

  • 迅速な開発
  • 大規模データ
  • 柔軟なスキーマのニーズ
  • シンプルなクエリ

希少性: 一般的 難易度: 簡単〜中程度


23. Node.jsでデータベースに接続するにはどうすればよいですか? (MongoDBの例)

回答: MongoDBをMongooseの例として使用します:

基本的な接続:

const mongoose = require('mongoose');

// 接続文字列
const mongoURI = 'mongodb://localhost:27017/mydb';

// 接続
mongoose.connect(mongoURI, {
  useNewUrlParser: true,
  useUnifiedTopology: true
})
.then(() => console.log('MongoDB connected'))
.catch(err => console.error('Connection error:', err));

環境変数を使用:

require('dotenv').config();

mongoose.connect(process.env.MONGODB_URI, {
  useNewUrlParser: true,
  useUnifiedTopology: true
});

接続イベント:

mongoose.connection.on('connected', () => {
  console.log('Mongoose connected to MongoDB');
});

mongoose.connection.on('error', (err) => {
  console.error('Mongoose connection error:', err);
});

mongoose.connection.on('disconnected', () => {
  console.log('Mongoose disconnected');
});

モデルの定義:

const userSchema = new mongoose.Schema({
  name: { type: String, required: true },
  email: { type: String, required: true, unique: true },
  age: { type: Number, min: 0 }
}, { timestamps: true });

const User = mongoose.model('User', userSchema);

モデルの使用:

// 作成
const user = await User.create({ name: 'John', email: '[email protected]' });

// 読み込み
const users = await User.find();
const user = await User.findById(userId);

// 更新
await User.findByIdAndUpdate(userId, { name: 'Jane' });

// 削除
Newsletter subscription

実際に機能する週次のキャリアのヒント

最新の洞察をメールボックスに直接お届けします

Decorative doodle

採用担当者に目立ち、夢の仕事を手に入れよう

ATSを通過し、採用担当者を感動させるAI搭載の履歴書でキャリアを変えた数千人の仲間に加わりましょう。

今すぐ作成を開始

この投稿を共有

6秒を最大限に活用

採用担当者は平均わずか6〜7秒しか履歴書をスキャンしません。当社の実績のあるテンプレートは、即座に注目を集め、読み続けてもらえるように設計されています。