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

Node.js - sending files to client using sendFile

本文关键字:客户端 sendFile 文件 js -发 Node      更新时间:2023-09-26

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

任何关于让这个代码工作的建议将是非常感谢的。我相信解决方案是显而易见的,但我似乎找不到任何工作。

一个请求发送一个文件。对于同一个请求,不能多次调用res.sendFile()(也不应该)。如果这是一个HTML页面,正在请求与<script>标签和<style>标签在它,然后浏览器将请求这些标签与单独的请求指定的其他文件。你在express应用程序中为它们创建路由,这样当客户端请求它们时,你就会发送匹配这些请求的适当文件。

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

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

res.sendFile()用于将位于指定路径的文件发送到客户端。

  • 一个HTTP GET请求只能有一个响应。在Express中,res.send()res.sendFile()方法用于将响应发送回客户端。一旦发送了响应,请求-响应周期就完成了。

  • 不能同时使用。

  • 尝试使用express.static()通过传递相对路径来静态访问这些文件