Ваш запрос должен быть направлен на сервер, а НЕ в файл server.js, который его создает.Итак, запрос должен выглядеть примерно так: xmlhttp.open("GET","http://localhost:8001/", true);
Кроме того, вы пытаетесь обслуживать внешний интерфейс (index.html) И обслуживать запросы AJAX по одному и тому же URI.Для этого вам нужно будет ввести логику в ваш server.js, которая будет различать ваши AJAX-запросы и обычный HTTP-запрос на доступ.Для этого вам нужно либо ввести данные GET / POST (например, вызвать http://localhost:8001/?getstring=true
), либо использовать другой путь для ваших запросов AJAX (например, вызвать http://localhost:8001/getstring
).Затем на стороне сервера вам нужно изучить объект запроса, чтобы определить, что писать в ответе.Для последнего варианта вам нужно использовать модуль 'url' для разбора запроса.
Вы правильно звоните listen()
, но неправильно пишете ответ.Прежде всего, если вы хотите использовать index.html при переходе к http://localhost:8001/,, вам необходимо записать содержимое файла в ответ, используя response.write()
или response.end()
.Во-первых, вам нужно включить fs=require('fs')
, чтобы получить доступ к файловой системе.Затем вам нужно на самом деле обслуживать файл.
Для XMLHttpRequest требуется заданная функция обратного вызова, если вы используете ее асинхронно (третий параметр = true, как вы уже сделали) И хотите что-то сделать с ответом.То, как вы сейчас это делаете, string
будет undefined
(или, возможно, null
), потому что эта строка будет выполняться до завершения AJAX-запроса (т. Е. ResponseText все еще пуст).Если вы используете его синхронно (третий параметр = false), вы можете написать встроенный код, как вы это сделали.Это не рекомендуется, так как он блокирует браузер во время запроса.Асинхронная операция обычно используется с функцией onreadystatechange, которая может обработать ответ после его завершения.Вам необходимо изучить основы XMLHttpRequest.Начало здесь .
Вот простая реализация, включающая в себя все перечисленное:
server.js:
var http = require('http'),
fs = require('fs'),
url = require('url'),
choices = ["hello world", "goodbye world"];
http.createServer(function(request, response){
var path = url.parse(request.url).pathname;
if(path=="/getstring"){
console.log("request recieved");
var string = choices[Math.floor(Math.random()*choices.length)];
console.log("string '" + string + "' chosen");
response.writeHead(200, {"Content-Type": "text/plain"});
response.end(string);
console.log("string sent");
}else{
fs.readFile('./index.html', function(err, file) {
if(err) {
// write an error response or nothing here
return;
}
response.writeHead(200, { 'Content-Type': 'text/html' });
response.end(file, "utf-8");
});
}
}).listen(8001);
console.log("server initialized");
frontend (часть index.html)):
function newGame()
{
guessCnt=0;
guess="";
server();
displayHash();
displayGuessStr();
displayGuessCnt();
}
function server()
{
xmlhttp = new XMLHttpRequest();
xmlhttp.open("GET","http://localhost:8001/getstring", true);
xmlhttp.onreadystatechange=function(){
if (xmlhttp.readyState==4 && xmlhttp.status==200){
string=xmlhttp.responseText;
}
}
xmlhttp.send();
}
Вам будет удобно с AJAX.Используйте учебный центр Mozilla, чтобы узнать о XMLHttpRequest.После того, как вы сможете использовать базовый объект XHR, вы, скорее всего, захотите использовать хорошую библиотеку AJAX вместо ручной записи кросс-браузерных запросов AJAX (например, в IE вам нужно будет использовать ActiveXObject вместо XHR).AJAX в jQuery превосходен, но если вам не нужно ничего другого jQuery предложений, найдите хорошую библиотеку AJAX здесь: http://microjs.com/. Вам также необходимо получитьудобен для документов node.js, найденных здесь .Ищите http://google.com для некоторых хороших обучающих программ сервера node.js и статического файлового сервера.http://nodetuts.com хорошее место для начала.
ОБНОВЛЕНИЕ: Я изменил response.sendHeader()
на новый response.writeHead()
в коде выше !!!