Node.js - 使用sendFile将文件发送到客户端

时间:2016-10-08 17:48:13

标签: javascript node.js socket.io

我是Node.js的新手,并且一直在关注游戏制作教程,可在此处找到:http://rawkes.com/articles/creating-a-real-time-multiplayer-game-with-websockets-and-node.html

我正在尝试通过将所有必要的文件发送到客户端来改进本教程中详述的游戏。

当我作为客户端连接到我的服务器时,服务器终端会抛出此错误,

_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)

以下是有问题的代码:

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()

有关使此代码正常工作的任何建议都将受到高度赞赏。我确信解决方案是显而易见的,但我找不到的任何东西似乎都有用。

1 个答案:

答案 0 :(得分:1)

一个请求发送一个文件。您无法多次为同一请求致电res.sendFile()(您也不应该)。如果这是一个HTML页面,其中包含<script>标记和<style>标记,则浏览器将请求具有单独请求的这些标记指定的其他文件。您可以在快速应用程序中为它们创建路由,因此当客户端请求它们时,您将发送与所需请求匹配的相应文件。

您可以使用express.static()使用一行代码为所有静态文件设置路由处理。

但是,这里的关键是app.get('/')是仅用于页面HTML的路由处理程序。然后,浏览器将请求该页面中的其他资源,您也需要这些资源的路由。您不只是在一次请求时发送多个文件。