Skip Navigation
Show nav
Heroku Dev Center Dev Center
  • Get Started
  • ドキュメント
  • Changelog
  • Search
Heroku Dev Center Dev Center
  • Get Started
    • Node.js
    • Ruby on Rails
    • Ruby
    • Python
    • Java
    • PHP
    • Go
    • Scala
    • Clojure
    • .NET
  • ドキュメント
  • Changelog
  • More
    Additional Resources
    • Home
    • Elements
    • Products
    • Pricing
    • Careers
    • Help
    • Status
    • Events
    • Podcasts
    • Compliance Center
    Heroku Blog

    Heroku Blog

    Find out what's new with Heroku on our blog.

    Visit Blog
  • Log in or Sign up
View categories

Categories

  • Heroku のアーキテクチャ
    • コンピューティング (dyno)
      • dyno の管理
      • dyno の概念
      • dyno の動作
      • dyno の参照資料
      • dyno のトラブルシューティング
    • スタック (オペレーティングシステムイメージ)
    • ネットワーキングと DNS
    • プラットフォームポリシー
    • プラットフォームの原則
    • buildpack
  • 開発者ツール
    • AI の操作
    • コマンドライン
    • Heroku の VS Code 拡張機能
  • デプロイ
    • Git を使用したデプロイ
    • Docker によるデプロイ
    • デプロイ統合
  • 継続的デリバリーとインテグレーション (Heroku Flow)
    • 継続的統合
  • 言語サポート
    • Node.js
      • Node.js アプリのトラブルシューティング
      • Node.js の操作
      • Heroku での Node.js の動作
    • Ruby
      • Rails のサポート
        • Rails の操作
      • Bundler の使用
      • Ruby の操作
      • Heroku での Ruby の動作
      • Ruby アプリのトラブルシューティング
    • Python
      • Python の操作
      • Python でのバックグラウンドジョブ
      • Heroku での Python の動作
      • Django の使用
    • Java
      • Heroku での Java の動作
      • Java の操作
      • Maven の使用
      • Spring Boot の使用
      • Java アプリのトラブルシューティング
    • PHP
      • Heroku での PHP の動作
      • PHP の操作
    • Go
      • Go の依存関係管理
    • Scala
    • Clojure
    • .NET
      • .NET の操作
  • データベースとデータ管理
    • Heroku Postgres
      • Postgres の基礎
      • Postgres スターターガイド
      • Postgres のパフォーマンス
      • Postgres のデータ転送と保持
      • Postgres の可用性
      • Postgres の特別なトピック
      • Heroku Postgres への移行
    • Heroku Key-Value Store
    • Apache Kafka on Heroku
    • その他のデータストア
  • AI
    • Inference の基礎知識
    • Inference API
    • Heroku Inference のクイックスタートガイド
    • AI モデル
    • ツールの使用
    • AI 連携
    • ベクトルデータベース
  • モニタリングとメトリクス
    • ログ記録
  • アプリのパフォーマンス
  • アドオン
    • すべてのアドオン
  • 共同作業
  • セキュリティ
    • アプリのセキュリティ
    • ID と認証
      • シングルサインオン (SSO)
    • Private Space
      • インフラストラクチャネットワーキング
    • コンプライアンス
  • Heroku Enterprise
    • Enterprise Accounts
    • Enterprise Team
  • パターンとベストプラクティス
  • Heroku の拡張
    • Platform API
    • アプリの Webhook
    • Heroku Labs
    • アドオンのビルド
      • アドオン開発のタスク
      • アドオン API
      • アドオンのガイドラインと要件
    • CLI プラグインのビルド
    • 開発ビルドパック
    • Dev Center
  • アカウントと請求
  • トラブルシューティングとサポート
  • Salesforce とのインテグレーション
    • Heroku AppLink
      • Heroku AppLink リファレンス
      • Heroku AppLink の使用
      • Heroku AppLink スターターガイド
    • Heroku Connect (Salesforce 同期)
      • Heroku Connect の管理
      • Heroku Connect のリファレンス
      • Heroku Connect のトラブルシューティング
    • その他の Salesforce 統合
  • 言語サポート
  • Node.js
  • Node.js の操作
  • Node.js での Heroku の WebSocket の使用

Node.js での Heroku の WebSocket の使用

日本語 — Switch to English

Table of Contents [expand]

  • WebSocket 対応アプリの設定
  • 依存関係のインストール
  • サーバーの作成
  • WebSocket クライアントの作成
  • アプリの起動
  • 理解を深める

最終更新日 2025年09月05日(金)

このチュートリアルでは、Heroku 上のリアルタイム Node.js アプリケーションの概要を説明します。サーバーの現在時刻を永続的なソケット接続経由でクライアントと共有する単純なアプリケーションを開発します。各アプリケーションは、Node の一般的な express​ Web サーバーに基づきます。

リアルタイム Node.js アプリケーションを開発する場合は、直接 WebSocket を使用できます。WebSocket プロトコルをサポートしていないクライアントにフォールバックを提供する Socket.io などの抽象化ライブラリを使用することもできます。両方のオプションを示します。

dyno を使用してこのチュートリアルを完了した場合、使用量のカウントに入ります。低料金プラン​を使用してこのチュートリアルを完了することをお勧めします。資格のある学生の皆様は、新しい Heroku for GitHub Students プログラム​を通じてプラットフォームクレジットを申請できます。

WebSocket 対応アプリの設定

アプリのディレクトリに移動し、デフォルトの package.json​ を作成します。

$ npm init --yes

package.json​ で Node のバージョンを指定し、アプリを起動するためのメカニズムを指定します。

"engines": {
  "node": "22.x"
},
"scripts": {
  "start": "node server.js"
}

依存関係のインストール

基本的な express​ Web サーバーから始めましょう。

$ npm install --save express

WebSocket 接続を使用するための最も簡単な方法は、ws モジュール​を使用することです。そのために、ws​、bufferutil​、utf-8-validate​ の各モジュールをインストールします。必要なのは ws​ モジュールだけですが、bufferutil​ および utf-8-validate​ モジュールによりパフォーマンスが向上​します。

$ npm install --save ws bufferutil utf-8-validate

サーバーの作成

以下の内容を含む、server.js​ という名前のファイルをアプリディレクトリのルートに作成します。

const express = require('express')
const { Server } = require('ws')

const PORT = process.env.PORT || 5001
const INDEX = '/index.html'

const server = express()
  .use((req, res) => res.sendFile(INDEX, { root: __dirname }))
  .listen(PORT, () => console.log(`Listening on ${PORT}`))

const wss = new Server({ server })

wss.on('connection', (ws) => {
  console.log('Client connected')
  ws.on('close', () => console.log('Client disconnected'))
});

setInterval(() => {
  wss.clients.forEach((client) => {
    client.send(new Date().toTimeString())
  })
}, 1000)

WebSocket 接続の受け入れ

WebSocket 接続を受け入れるには、HTTP サーバーで次の 2 つの処理を実行する必要があります。 - クライアント側のアセットを提供します。 - WebSocket サーバーがリクエストを監視するためのフックを提供します。

これは、server.js​ 内で次のコード行によって処理されます。

const PORT = process.env.PORT || 5001
const INDEX = '/index.html'

const server = express()
  .use((req, res) => res.sendFile(INDEX, { root: __dirname }))
  .listen(PORT, () => console.log(`Listening on ${PORT}`))

次に WebSocket サーバーは、イベントをリッスンできるように、HTTP サーバーを引数として受け取る必要があります。これは、server.js​ 内で次のコード行によって処理されます。

const { Server } = require('ws')

const wss = new Server({ server })

最後に、接続と切断をリッスンしてログに記録します。クライアントが接続されたら、そのクライアントからのメッセージのためのイベントハンドラを追加できます。server.js​ 内で、これは次のコード行によって処理されます。

wss.on('connection', (ws) => {
  console.log('Client connected')
  ws.on('close', () => console.log('Client disconnected'))
})

最新情報のブロードキャスト

ソケット接続の利点の 1 つは、サーバーがクライアントリクエストを待機することなく、データをクライアントにブロードキャストできることです。このサンプルアプリでは、server.js​ からの次のコードを使用して、1 秒ごとに現在時刻をすべてのクライアントにプッシュします。

setInterval(() => {
  wss.clients.forEach((client) => {
    client.send(new Date().toTimeString())
  });
}, 1000)

WebSocket クライアントの作成

以下の内容を含む、index.js​ という名前のファイルをアプリディレクトリのルートに作成します。

<html>
  <head>
    <script>
      let HOST = location.origin.replace(/^http/, 'ws')
      let ws = new WebSocket(HOST);
      let el;

      ws.onmessage = (event) => {
        el = document.getElementById('server-time');
        el.innerHTML = 'Server time: ' + event.data;
      };
    </script>
  </head>
  <body>
    <p id="server-time"></p>
  </body>
</html>

これは、サーバーからの時刻の更新をリッスンする単純な HTML ページです。WebSocket サーバーに接続し、ブロードキャストされたメッセージをリッスンして、これらのメッセージをページに書き込みます。

アプリの起動

これでサーバーを起動できるようになりました。

$ npm start
> node server.js

Listening on 5001

http://localhost:5001​ でアプリをローカルにテストして、時刻がリアルタイムに更新されることを確認します。サーバーログにも Client connected​ と記録されます。

動作に満足したら、.gitignore​ に追加する node_modules​ を除いたすべてのファイルを Git にコミットします。次に、アプリを Heroku にデプロイします。

$ heroku create
git commit -am 'websocket starting point'
git push heroku main
heroku open

理解を深める

  • Socket.io​ のようなライブラリを使用すると、リアルタイムアプリケーションをより堅牢にすることができます。HTTP ロングポーリングなどのメソッドにフォールバックして、WebSocket に対応していないユーザーにサービスを提供したり、自動再接続を処理したり、多重化や名前空間ルームなどの高度な機能を提供したりできます。

  • リアルタイムアプリをクラスタモードで実行する場合、または複数の dyno にスケーリングする場合は、セッションアフィニティ​を有効にすることをお勧めします。

$ heroku features:enable http-session-affinity

Socket.io​ の設定については、こちら​の手順を参照してください。

Information & Support

  • Getting Started
  • Documentation
  • Changelog
  • Compliance Center
  • Training & Education
  • Blog
  • Support Channels
  • Status

Language Reference

  • Node.js
  • Ruby
  • Java
  • PHP
  • Python
  • Go
  • Scala
  • Clojure
  • .NET

Other Resources

  • Careers
  • Elements
  • Products
  • Pricing
  • RSS
    • Dev Center Articles
    • Dev Center Changelog
    • Heroku Blog
    • Heroku News Blog
    • Heroku Engineering Blog
  • Twitter
    • Dev Center Articles
    • Dev Center Changelog
    • Heroku
    • Heroku Status
  • Github
  • LinkedIn
  • © 2026 Salesforce, Inc. All rights reserved. Various trademarks held by their respective owners. Salesforce Tower, 415 Mission Street, 3rd Floor, San Francisco, CA 94105, United States
  • heroku.com
  • Legal
  • Terms of Service
  • Privacy Information
  • Responsible Disclosure
  • Trust
  • Contact
  • Cookie Preferences
  • Your Privacy Choices