質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.34%

  • Node.js

    2013questions

    Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

  • Cloud9

    460questions

    Cloud9は、クラウドからのプログラミングが可能になるWebサービス。IDEとしての機能が搭載されており、GitHubやHerokuなど他ツールとの連携も可能です。ブラウザ上で動くため、デバイスに関係なく開発環境を準備できます。

  • Express

    262questions

    ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

  • Socket.IO

    204questions

    Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。

socket.ioを使おうとしたら、Error: listen EACCESというメッセージが出てくる

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 656

razona

score 6

前提・実現したいこと

node.jsを使い、socket.ioを使ったサイトを作ろうとしています。
expressを使って動的URLも組み込みたいです。

発生している問題・エラーメッセージ

app.jsを起動しようとすると、ターミナルに下記のエラーが吐き出されてしまい、socket接続が上手くいきません。

  warn  - error raised: Error: listen EACCES 0.0.0.0:80

該当のソースコード

var http = require('http');
var path = require('path');
var async = require('async');
var socketio = require('socket.io');
var io = socketio.listen( server );
var express = require('express'),
      app = express();

var router = express();
var server = http.createServer(router);

app.listen(process.env.PORT || 3000, process.env.IP || "0.0.0.0", function(){
  var addr = server.address();
});


app.use(express.json());
app.use(express.urlencoded());
app.use(express.logger('dev'));
app.use(function(req,res,next){
    next();
});

app.set('views', __dirname + '/client');
app.set('view engine', 'ejs');

 app.get('/', function(req, res) {
 res.render('index');
});

io.sockets.on('connection', (socket) => {
  console.log('a user connected');
});
<!DOCTYPE HTML>
<html lang="ja">
    <head>
         <meta charset="UTF-8">
         <title>index</title>
         <script src="/socket.io/socket.io.js"></script>
         <script>
              var socket = io();
         </script>  
   </head>
</html>

試したこと

expressを使って動的URL
expressとsocket.ioの両方を使っているcloud9のsocket.ioサンプルコードを流用して書き換えようとしたところ、socket通信には成功したものの、動的URLを上手く扱えませんでした。

cloud9のnode.jsサンプル

//
// # SimpleServer
//
// A simple chat server using Socket.IO, Express, and Async.
//
var http = require('http');
var path = require('path');

var async = require('async');
var socketio = require('socket.io');
var express = require('express'),
    app=express();

//
// ## SimpleServer `SimpleServer(obj)`
//
// Creates a new instance of SimpleServer with the following options:
//  * `port` - The HTTP port to listen on. If `process.env.PORT` is set, _it overrides this value_.
//
var router = express();
var server = http.createServer(router);
var io = socketio.listen(server);

router.use(express.static(path.resolve(__dirname, 'client')));
var messages = [];
var sockets = [];

io.on('connection', function (socket) {
    messages.forEach(function (data) {
      socket.emit('message', data);
    });

    sockets.push(socket);

    socket.on('disconnect', function () {
      sockets.splice(sockets.indexOf(socket), 1);
      updateRoster();
    });

    socket.on('message', function (msg) {
      var text = String(msg || '');

      if (!text)
        return;

      socket.get('name', function (err, name) {
        var data = {
          name: name,
          text: text
        };

        broadcast('message', data);
        messages.push(data);
      });
    });

    socket.on('identify', function (name) {
      socket.set('name', String(name || 'Anonymous'), function (err) {
        updateRoster();
      });
    });
  });

function updateRoster() {
  async.map(
    sockets,
    function (socket, callback) {
      socket.get('name', callback);
    },
    function (err, names) {
      broadcast('roster', names);
    }
  );
}

function broadcast(event, data) {
  sockets.forEach(function (socket) {
    socket.emit(event, data);
  });
}


server.listen(process.env.PORT || 3000, process.env.IP || "0.0.0.0", function(){
  var addr = server.address();
  console.log("Chat server listening at", addr.address + ":" + addr.port);
});
<!doctype html>
<html lang="en" ng-app>
  <head>
    <title>Chat Example</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="/css/bootstrap.min.css">
    <link rel="stylesheet" href="/css/bootstrap-responsive.min.css">
    <style>
      body {
        padding-top: 60px;
      }
    </style>
    <script>
      function ChatController($scope) {
        var socket = io.connect();

        $scope.messages = [];
        $scope.roster = [];
        $scope.name = '';
        $scope.text = '';

        socket.on('connect', function () {
          $scope.setName();
        });

        socket.on('message', function (msg) {
          $scope.messages.push(msg);
          $scope.$apply();
        });

        socket.on('roster', function (names) {
          $scope.roster = names;
          $scope.$apply();
        });

        $scope.send = function send() {
          console.log('Sending message:', $scope.text);
          socket.emit('message', $scope.text);
          $scope.text = '';
        };

        $scope.setName = function setName() {
          socket.emit('identify', $scope.name);
        };
      }
    </script>
  </head>
  <body>
    <div class="container" ng-controller="ChatController">
      <div class="navbar navbar-fixed-top navbar-inverse">
        <div class="navbar-inner">
          <div class="pull-right">
            <a href="https://c9.io" class="brand">Cloud9 IDE</a>
          </div>
        </div>
      </div>
      <div class="page-header">
        <h1>Chat Example</h1>
      </div>
      <div class="row">
        <div class="span3">
          <ul class="nav nav-list well">
            <li class="nav-header">Local Users</li>
            <li ng-repeat="user in roster" ng-bind="user">
            </li>
          </ul>
        </div>
        <div class="span9">
          <table class="table table-striped table-bordered">
            <thead>
              <tr>
                <th class="span2">Name</th>
                <th class="span7">Text</th>
              </tr>
            </thead>
            <tbody>
              <tr ng-repeat="msg in messages">
                <td class="span2" ng-bind="msg.name"></td>
                <td class="span7" ng-bind="msg.text"></td>
              </tr>
            </tbody>
          </table>
          <div class="row controls">
            <form ng-submit="send()">
              <div class="span2"><input type="text" class="input-block-level" ng-model="name" ng-change="setName()" placeholder="Your Name"></div>
              <div class="input-append span7">
                <input type="text" class="span6" ng-model="text" placeholder="Message">
                <input type="submit" class="span1 btn btn-primary" value="Send" ng-disabled="!text">
              </div>
            </form>
          </div>
        </div>
      </div>
    </div>
    <script src="/socket.io/socket.io.js"></script>
    <script src="/js/jquery.min.js"></script>
    <script src="/js/bootstrap.min.js"></script>
    <script src="/js/angular.min.js"></script>
  </body>
</html>


逆に、cloud9のサンプルコードのindex.htmlをそのまま持ってきたところ、表示はできたもののsocket接続ができませんでした。

補足情報(言語/FW/ツール等のバージョンなど)

node.js v6.11.2
express 3.2.6 
socket.io 0.9.19

開発環境はcloud9です。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+2

express 3.2.6 
socket.io 0.9.19

これはcloud9のサンプルに合わせたバージョンでしょうか?
バージョンが古いのでこちらのsocket.ioのサンプルを参考にした方が良いでしょう。
https://socket.io/get-started/chat/

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/20 15:12

    cloud9のサンプルコードのまま使っていたのですが、node,jsも各種モジュールも全てアップデートをかけたところ、上手く動作するようになりました。
    ありがとうございます!

    キャンセル

checkベストアンサー

+1

var io = socketio.listen( server );
この時点で、 server がまだ未定義です。

var express = require('express'),
      app = express();

var router = express();
var server = http.createServer(router);

var io = socketio.listen( server );の前に書いてみてください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/19 01:24 編集

    ありがとうございます!エラーメッセージが消えました!!

    しかし、今度は
    GET /socket.io/socket.io.js 404 1ms
    というように404エラーが出てしまい、やはり接続ができません……

    キャンセル

  • 2017/09/19 11:10

    app.listen(process.env.PORT || 3000, process.env.IP || "0.0.0.0", function(){
    ここの行は、
    server.listen(process.env.PORT || 3000, process.env.IP || "0.0.0.0", function(){
    ではないでしょうか?

    キャンセル

  • 2017/09/19 13:17

    丁寧にありがとうございます。

    しかし、今度はルーティングが上手くいかずに Cannot GET / が表示されてしまいました…

    キャンセル

  • 2017/09/19 13:20

    htmlファイルはapp.jsと同じディレクトリにあるのでしょうか?
    同じディレクトリであれば、
    app.get('/', function(req, res) {
    res.render('index');
    });
    ここを
    app.get('/', function (req, res) {
    res.sendFile(__dirname +'/index.html');
    });
    とすればうまく表示されるはずです。

    キャンセル

  • 2017/09/20 15:10

    こんなに丁寧に回答してくださって本当にありがとうございます。
    ちゃんと実装することができました。

    本当に助かりました。

    キャンセル

  • 2017/09/20 15:12

    解決したようでよかったです。

    キャンセル

同じタグがついた質問を見る

  • Node.js

    2013questions

    Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

  • Cloud9

    460questions

    Cloud9は、クラウドからのプログラミングが可能になるWebサービス。IDEとしての機能が搭載されており、GitHubやHerokuなど他ツールとの連携も可能です。ブラウザ上で動くため、デバイスに関係なく開発環境を準備できます。

  • Express

    262questions

    ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

  • Socket.IO

    204questions

    Socket.IOはNode.js上で動くライブラリであり、すべてのブラウザとモバイルデバイスでリアルタイムのアプリを作動させる事を目的としています。