web-dev-qa-db-ja.com

HerokuにNode.js / Express / Socket.ioアプリケーションをデプロイしようとするとアプリケーションエラーが発生する

私はこれらのテクノロジー(JavaScriptを含む)のすべてにかなり慣れているので、ここで我慢する必要があるかもしれません。

私はSocket.IOのドキュメントでChatAppチュートリアルをかなり詳しく調べ、アプリケーションを多少変更しました。しかし、サーバーとのやり取りなどの面で大きな変化はないと思います。私の問題は私が何をしても関係なく、アプリケーションをHerokuで正常に実行させることができないようです。アプリを読み込もうとすると、次のエラーメッセージが表示されます。

アプリケーションエラーアプリケーションでエラーが発生し、ページを配信できませんでした。しばらくしてからもう一度お試しください。アプリケーションの所有者の場合は、ログで詳細を確認してください。

私は何か明白なものや何が欠けているのかわかりません。

ここに私のメインのindex.jsファイルがあります:

var express = require('express');
var app = express();
var http = require('http').Server(app);
var io = require('socket.io')(http);

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

app.use("/css", express.static(__dirname + '/css'));

//array of users currently in chat
var people = {};

io.on('connection', function(socket){
    console.log('user connected!');

    socket.on('join', function(name){
        people[socket.id] = name; //create entry in 'people' with new user
        socket.emit("update", "You have connected to the server.");
        io.sockets.emit("update", name + " has joined the server.");
        io.sockets.emit("update_people_list", people);
    });

    socket.on('disconnect', function(){
        console.log('user disconnected!');
        if(people[socket.id] != ""){
            io.sockets.emit("update", people[socket.id] + " has left the server.");
            delete people[socket.id];
            io.sockets.emit("update_people_list", people);
        }
    });

    socket.on('chat message', function(msg){
        console.log('message: ' + msg);
        io.sockets.emit('chat message', people[socket.id], msg);
    });
});


// http.listen(3000, function(){
//  console.log('listening on *:3000');
// });

index.html

<script src="/socket.io/socket.io.js"></script>
<script src="http://code.jquery.com/jquery.js"></script>
<script>
  $(document).ready(function(){
    var ready = false;
    var socket = io.connect();

    $("#chat").hide();
    $(".canvasDiv").hide();
    $("#name").focus();
    //prevent form from being submitted without name
    $("form").submit(function(event){
      event.preventDefault();
    });

    //allows entering by hitting 'Enter' for name
    $("#name").keypress(function(e){
      if(e.which == 13) { //if ENTER key
        var name = $("#name").val();
        if(name != ""){
          socket.emit("join", name);
          $("#login").detach();
          $("#chat").show();
          $("#msg").focus();
          ready = true;
        }
      }
    });

    $('#chatform').submit(function(){  //when submit chat message
      socket.emit('chat message', $('#msg').val()); //emit message + value of input
      $('#msg').val('');  //empty field?
      return false; //so that the page doesn't refresh
    });

    //SOCKET LISTENING
    socket.on('chat message', function(user, msg){
      if(ready){
        $('#messages').append("<p><strong><span class='chat-user'>" + htmlEntities(user) + " </span></strong>:  " + htmlEntities(msg) + "</p>");
        //adjust height and scroll as need be:
        var $container = $('#messages');
        var height = $container.get(0).scrollHeight;
        $container.scrollTop(height);
      }
    });

    socket.on("update", function(io_message){
      if(ready){
        $('#messages').append("<p class='notification'>" + htmlEntities(io_message) + "</p>")
      }
    });

    socket.on("update_people_list", function(people){
      if(ready){
        $("#people").empty(); //clear to refresh it
        $.each(people, function(client_id, name){
          $('#people').append("<p class='notification'>" + htmlEntities(name) + "</p>");
        });
        var $container = $("#messages");
        var height = $container.get(0).scrollHeight;
        $container.scrollTop(height);
      }
    });

  });
</script>

さらに、私のpackage.jsonファイル

 {
  "name": "socket-chat-example",
  "version": "0.0.1",
  "description": "my first socket.io app",
  "dependencies": {
    "express": "^4.6.1",
    "socket.io": "^1.0.6"
  }
}

Procfile:

web: node index.js

.gitignore:

node_modules/
11
keb

開示:私はNode Herokuのプラットフォームオーナーです

最初に、ログ出力を取得するには_heroku logs_を実行する必要があります。

次に、サーバーでlistenをコメント化したことを意味しますか?これがないと、サーバーは着信接続を許可しません。

// http.listen(3000, function(){ // console.log('listening on *:3000'); // });

最後に、ハードコードされたポート(3000)にバインドする代わりに、デフォルトで環境変数にバインドする必要があります。

http.listen(process.env.PORT || 3000, function(){ console.log('listening on', http.address().port); });

31
hunterloftis

同じエラーが発生しましたが、"start":"node app.js" package.jsonファイル内で問題を修正する傾向があります。これが同じエラーに遭遇した人を助けることを願っています。

注: app.jsは、独自のメインサーバーファイルにする必要があります。

3
Nhiyhe

heroku logsを確認した後、bcryptの依存関係がpackage.jsonで適切に定義されていることがわかりました。私はあなたをお勧めします:

  1. 依存関係に正しいバージョンが添付されていることを確認してください。
  2. Node_modulesファイルを削除する
  3. npm installを実行します
  4. すべての依存関係が正しくインストールされているかどうかを確認します
  5. 適切にインストールされている場合は、git Push heroku
2
Clement

Nodeアプリを数週間使用しなかった後にもこのエラーが発生しました。その理由は、アプリがスリープ状態になっただけでなく、データベースとその接続もスリープ状態になったためです。私はm MongoLabがホストする無料のMongoDBインスタンスを使用します。

アプリのローカルコピーを実行してこれを修正し、MongoLabを呼び起こしました。それから数分後、Herokuでホストされているアプリが再び機能し始めました。

0
Grid Trekkor

すべての依存関係を確認してください。 package.jsonをクロスチェックして確認するか、package.json内のすべての依存関係の更新インストールを行うことができます

0
Fakuade Segun