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 решения:
// Сложное решение
/* 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 } }
// Простое решение
Я бы порекомендовал вам использовать мой модуль 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 */