0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

RailwayでNode.jsバックエンドを初めてデプロイ時に遭遇したエラーと解決法 - 環境変数とデータベース接続の落とし穴

Posted at

フィットトラッキングアプリ開発、Railway×Node.jsに挑戦中の
転職準備中のプログラマー未経験初心者です。

今回は初めてのデプロイでの環境構築で躓いたことを共有します

  • フレームワーク / ライブラリ:

    • Node.js (Express)
    • Sequelize CLI
    • PostgreSQL
    • express-jwt
  • ゴール(何を実装したかったか):
    ローカルで開発したNode.jsバックエンドアプリケーションをRailwayにデプロイし、PostgreSQLデータベースと接続して本番環境で動作させる

  • 作業環境:

    • OS: macOS
    • Node.js: v18+
    • PostgreSQL: 14
    • デプロイ先: Railway

2. 発生した問題

時刻 現象 エラーメッセージ
- JWT認証エラー RangeError: express-jwt: 'secret' is a required option
- DB接続エラー Using environment "development"
ERROR: getaddrinfo ENOTFOUND postgres.railway.internal

再現条件:

  1. GitHubリポジトリをRailwayに接続
  2. PostgreSQLサービスを追加
  3. railway run npm run migrateコマンドを実行

関連コード:

// config/database.js
module.exports = {
  development: {
    username: process.env.DB_USER,
    password: process.env.DB_PASSWORD,
    database: process.env.DB_NAME,
    host: 'localhost',
    dialect: 'postgres'
  },
  production: {
    username: process.env.DB_USER,
    password: process.env.DB_PASSWORD,
    database: process.env.DB_NAME,
    host: process.env.DB_HOST,
    dialect: 'postgres'
  }
};

3. 仮説と検証

仮説 検証手順 結果 新たな気づき
環境変数が未設定 Railway Variablesを確認 JWT_SECRET_KEYが未設定だった
NODE_ENVが未指定 ログを確認 デフォルトでdevelopmentが使用されていた
DB接続情報の不一致 環境変数の値を確認 ローカルとRailwayで異なるホスト名が必要

デバッグで使ったツール/手法:

  • ✅ console.log
  • ✅ Railway ログ
  • ✅ 環境変数の出力確認

4. 根本的な原因 / 知識のギャップ

真の原因:

  1. JWT Secret エラー: Railway Variables でJWT_SECRET_KEYが未設定
  2. 環境設定エラー: NODE_ENVが未指定のため、デフォルトでdevelopment環境が使用され、接続先DBホストが不一致

自分の知識で足りなかった部分:

  • 基本概念: 環境変数の開発環境と本番環境での違い
  • フレームワーク仕様: SequelizeのNODE_ENVデフォルト値
  • 環境設定: Railwayの環境変数自動展開の仕組み

エラーの分類: ✅環境 ✅設定

5. 最終的な解決策

解決コード:

// package.json - scripts部分を修正
"scripts": {
  "migrate": "npx sequelize-cli db:migrate",
  "migrate:prod": "NODE_ENV=production npx sequelize-cli db:migrate",
  "migrate:dev": "NODE_ENV=development npx sequelize-cli db:migrate"
}

設定変更:

  • Railway Variables → JWT_SECRET_KEY を追加
  • Railway Variables → DB_HOST=${{Postgres.PGHOST}} を設定
  • Railway Variables → DB_USER, DB_PASSWORD, DB_NAME を自動展開で設定

解決に至った決め手:
NODE_ENVを明示的に指定することで、開発と本番で実行環境を使い分けできる

6. 応用と予防

目標:類似問題への対処法を準備

類似問題の予測

このパターンで起こりそうな他の問題:

  1. 他の環境変数(API_KEY等)の設定漏れ
  2. 異なるデプロイサービス(Heroku、Vercel)での同様の環境設定問題
  3. マイグレーション以外のコマンドでのNODE_ENV未指定

予防策の立案

今後同じ問題を防ぐ方法:

  • コードレビューでチェック: 環境変数の使用箇所を確認
  • 自動テスト追加: 環境変数の存在チェック(転職活動で余裕があれば)
  • 設定ファイル整備: .env.exampleファイルの作成

応用アイデア

他のプロジェクト/機能で活かせそうなこと:

  • プロジェクト: 他のNode.jsアプリ → 活用方法: 同じscripts設定を適用
  • 機能: CI/CDパイプライン → 活用方法: 環境変数チェックを自動化(転職活動で余裕があれば)

振り返りと評価

学習効果

今回のデバッグで身についたスキル (1-5点):

  • 問題特定力: 4点
  • 仮説構築力: 4点
  • 検証効率: 3点
  • 解決スピード: 3点

改善点

次回もっと早く解決するには:

  • エラーメッセージを最初から注意深く読む
  • 環境設定の基本を再確認してから作業開始

成長実感

以前の自分と比べて成長した点:
開発環境と本番環境の違いを明確に理解し、環境変数の役割とその設定方法について体系的に理解できるようになった

💡今日の一言学習メモ

**開発環境と本番環境は独立している。それぞれの専用の鍵(環境変数)が必要で、正しい鍵を使わないと中身(データベース)にアクセスできない。

環境構成図

【ローカル開発環境】
┌─────────────────────────────────────┐
│  MacBook Pro                        │
│                                     │
│  ┌─────────────────┐  ┌──────────┐ │
│  │ Node.js Backend │→ │PostgreSQL│ │
│  │ localhost:8000  │  │   14     │ │
│  └─────────────────┘  │          │ │
│                       │ローカルDB │ │
│                       └──────────┘ │
└─────────────────────────────────────┘

【Railway本番環境】
┌─────────────────────────────────────┐
│  Railway クラウドインフラ            │
│                                     │
│  ┌─────────────────┐  ┌──────────┐ │
│  │ Node.js Backend │→ │PostgreSQL│ │
│  │ Railway Service │  │ Railway  │ │
│  └─────────────────┘  │ Service  │ │
│                       │          │ │
│                       │Railway DB│ │
│                       └──────────┘ │
└─────────────────────────────────────┘

この経験を通じて、デプロイは単にコードをアップロードするだけでなく、環境の違いを理解し、適切に設定することが重要だと学びました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?