Node.js, обслуживающий изображения для холста

Я пытаюсь создать простую игру с помощью node.js, чтобы получить больше знаний о сетях и прочем, что с этим связано. Но сейчас я застрял. Я уже несколько часов выдергиваю волосы и ищу в Интернете, но, похоже, не могу найти решение. Я обнаружил только некоторые полезные модули, такие как path.js и mime.js.

Код моего сервера выглядит так:

var http = require("http");
var host = "127.0.0.1";
var port = 3000;
var url = require('url');
var fs = require("fs");
var path = require("path");
var mime = require('mime');

var server = http.createServer(function(request, response) {
    console.log("Request received: " + request.url);
    fs.readFile(__dirname + '/game.html', function(error, data) {
        if (error) {
            response.writeHead(404, {"Content-type":"text/plain"});
            response.end("Sorry, the page was not found");
        } else {
            var holder = url.parse(request.url);
            var ext = path.extname(holder.pathname);
            response.setHeader('Content-type',"" + mime.lookup(ext));
            response.writeHead(200);
            response.end(data);
            if (ext == ".png") {
                response.setHeader('Content-type',"image/png");
                response.writeHead(200);
                response.end(data);
            } else if (ext == ".jpeg") {
                response.setHeader('Content-type',"image/jpeg");
                response.writeHead(200);
                response.end(data);
            }
        }
    });
});

var io = require('socket.io').listen(server);

Переменная сервера - это то, что, кажется, вызывает у меня проблемы. Игра, которую я пытаюсь реализовать, находится здесь: http://jsfiddle.net/6mWkU/2/ Nevermind графика;)

С кодом моего сервера ни одно из изображений не обслуживается. Я попытался использовать path.js и mime.js, поэтому он устанавливает конкретный тип контента для каждого вызова, но это не сработало.

Надеюсь, вы, ребята, знаете, что не так, и можете помочь новичку!

1 ответ

Ваш сервер работает некорректно, при каждом запросе вы читаете содержимое файла '/game.html' (вы можете прочитать его и кэшировать, обновляя только некоторые внесенные изменения), тем самым вы отвечаете на каждый запрос (!) с содержимым html-файла без какой-либо проверки и после проверки расширения запроса (но он уже был получен), и, если это правда, вы снова пишете в ответ (здесь у вас должно быть несколько ошибок в консоли узла), вы не можете писать после завершения в записываемых потоках.

У меня есть для вас 2 решения:

  1. // Сложное решение

    /* Inside the createServer callback */
    if (request.url === '/') {
        // read the file and respond with html
    } else {
        if (/* check for the existence of the urls */) {
            // get the content of the file and respond with it's content and content-type
            // and don't forget to do this asynchronously!
        } else {
            // return 404
        }
    }
    
  2. // Простое решение

    Я бы порекомендовал вам использовать мой модуль simpleS, он все сделает за вас (!). будет обслуживать статические файлы и даст вам возможность использовать возможности веб-сокетов. Просто поместите все файлы в папку, например "static", затем используйте следующий код:

    var simples = require('simples');
    
    var server = simples(3000);
    
    server.get('/', function (connection) {
        connection.type('html');
        connection.drain(__dirname + '/game.html');
    });
    
    server.serve(__dirname + '/static');
    
    /*
      And that's all!
      To work with websockets read the documentation please
    */
    
Другие вопросы по тегам