2016-10-08 12 views
2

を使用して、クライアントにファイルを送信するには、ここで見つける:http://rawkes.com/articles/creating-a-real-time-multiplayer-game-with-websockets-and-node.htmlのNode.js - 私はNode.jsのに非常に新しいですし、ゲーム作りのチュートリアルを追っているSENDFILE

私はで詳述したゲームを改善しようとしていますチュートリアルでは、すべての必要なファイルをクライアントに送信します。

var util = require("util"), 
 
    Player = require("./Player").Player; 
 

 
var app = require('express')(); 
 
var http = require('http'); 
 
var httpServer = http.createServer(app); 
 
httpServer.listen(8000) 
 
var io = require('socket.io'); 
 

 

 
var socket, 
 
    players; 
 
app.get('/', function(req, res){ 
 
    res.sendFile(__dirname + '/public/index.html'); 
 
    res.sendFile(__dirname + '/public/js/game.js'); 
 
    res.sendFile(__dirname + '/public/js/Keys.js'); 
 
    res.sendFile(__dirname + '/public/js/Player.js'); 
 
    res.sendFile(__dirname + '/public/js/requestAnimationFrame.js'); 
 
    res.sendFile(__dirname + '/public/style/game.css'); 
 
    res.sendFile(__dirname + '/public/style/reset.css'); 
 
}); 
 
function init() { 
 
    players = []; 
 
    socket = io.listen(httpServer) 
 
    
 
    //streamline 
 
    socket.configure(function() { 
 
    socket.set("transports", ["websocket"]); 
 
    socket.set("log level", 2); 
 
}); 
 
    
 
    
 
    setEventHandlers() 
 
    
 
} 
 

 

 
init()

私はクライアントとして私のサーバーに接続すると、このエラーはサーバ端末にスローされ、

_http_outgoing.js:344 
 
    throw new Error('Can\'t set headers after they are sent.'); 
 
    ^
 

 
Error: Can't set headers after they are sent. 
 
    at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:344:11) 
 
    at Array.write (/Users/Mark/node_modules/express/node_modules/finalhandler/index.js:164:9) 
 
    at listener (/Users/Mark/node_modules/express/node_modules/on-finished/index.js:169:15) 
 
    at onFinish (/Users/Mark/node_modules/express/node_modules/on-finished/index.js:100:5) 
 
    at callback (/Users/Mark/node_modules/express/node_modules/on-finished/node_modules/ee-first/index.js:55:10) 
 
    at IncomingMessage.onevent (/Users/Mark/node_modules/express/node_modules/on-finished/node_modules/ee-first/index.js:93:5) 
 
    at emitNone (events.js:67:13) 
 
    at IncomingMessage.emit (events.js:166:7) 
 
    at endReadableNT (_stream_readable.js:921:12) 
 
    at nextTickCallbackWith2Args (node.js:442:9)

ここでは、問題のコードです

このコードを動作させるための提案は非常に高く評価されます。私は解決策が明らかだと確信していますが、私が見つけることができるものは何も動作していないようです。

+0

応答オブジェクトに対して 'setHeader'を呼び出しましたか? – Rayon

+2

1つの要求で1つのファイルが送信されます。 'res.sendFile()'を複数回呼び出すことはできません。クライアントは他のファイルを要求し、エクスプレスアプリでそれらのルートを作成するので、クライアントが要求すると、要求に合った適切なファイルが送信されます。 'express.static()'を使うと、1行のコードですべての静的ファイルのルート処理を設定することができます。 – jfriend00

+0

@ jfriend00答えとして投稿できますか?それは正しい答えです。 –

答えて

1

1つの要求で1つのファイルが送信されます。同じ要求に対してres.sendFile()を複数回呼び出すことはできません。これが<script>タグと<style>タグで要求されているHTMLページである場合、ブラウザはこれらのタグで指定された他のファイルを別々の要求で要求します。あなたのエクスプレスアプリでそれらのルートを作成するので、クライアントが要求すると、それらの要求に合った適切なファイルが送信されます。

express.static()を使用すると、1行のコードですべての静的ファイルのルート処理を設定できます。

ただし、ここでのキーは、app.get('/')がページのHTML専用のルートハンドラであることです。ブラウザはそのページの他のリソースを要求し、そのリソースのルートも必要になります。 1回のリクエストで複数のファイルを送信するだけではありません。

関連する問題