Базовый Ajax отправка / получение с помощью node.js - PullRequest
54 голосов
/ 16 мая 2011

Итак, я пытаюсь создать очень простой сервер node.js, который с помощью запроса на строку выбирает случайным образом один из массивов и возвращает выбранную строку. К сожалению, я столкнулся с несколькими проблемами.

Вот передний конец:

function newGame()
{
   guessCnt=0;
   guess="";
   server();
   displayHash();
   displayGuessStr();
   displayGuessCnt();
}

function server()
{
   xmlhttp = new XMLHttpRequest();

   xmlhttp.open("GET","server.js", true);
   xmlhttp.send();

   string=xmlhttp.responseText;
}

Это должно отправить запрос на server.js:

var http = require('http');

var choices=["hello world", "goodbye world"];

console.log("server initialized");

http.createServer(function(request, response)
{
    console.log("request recieved");
    var string = choices[Math.floor(Math.random()*choices.length)];
    console.log("string '" + string + "' chosen");
    response.on(string);
    console.log("string sent");
}).listen(8001);

Итак, ясно, что здесь происходит несколько ошибок:

  1. У меня такое ощущение, что я "соединяю" эти два файла, это неправильно как в методе xmlhttp.open, так и при использовании response.on для отправки строки обратно во внешний интерфейс.

  2. Я немного запутался в том, как я вызываю эту страницу на localhost. Внешний интерфейс называется index.html, а сервер отправляет 8001. По какому адресу я должен перейти на localhost, чтобы получить доступ к начальной html-странице после того, как я инициализировал server.js? Должен ли я изменить его на .listen(index.html) или что-то подобное?

  3. есть ли другие очевидные проблемы с тем, как я это реализую (используя .responsetext и т. Д.)

(извините за длинный пост с несколькими вопросами, но различные учебные пособия и источник node.js предполагают, что пользователь уже понимает эти вещи.)

Ответы [ 4 ]

60 голосов
/ 16 мая 2011
  1. Ваш запрос должен быть направлен на сервер, а НЕ в файл 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' для разбора запроса.

  2. Вы правильно звоните listen(), но неправильно пишете ответ.Прежде всего, если вы хотите использовать index.html при переходе к http://localhost:8001/,, вам необходимо записать содержимое файла в ответ, используя response.write() или response.end().Во-первых, вам нужно включить fs=require('fs'), чтобы получить доступ к файловой системе.Затем вам нужно на самом деле обслуживать файл.

  3. Для 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() в коде выше !!!

29 голосов
/ 07 декабря 2011

Express делает такие вещи действительно интуитивно понятными.Синтаксис выглядит следующим образом:

var app = require('express').createServer();
app.get("/string", function(req, res) {
    var strings = ["rad", "bla", "ska"]
    var n = Math.floor(Math.random() * strings.length)
    res.send(strings[n])
})
app.listen(8001)

http://expressjs.com/guide.html

Если вы используете jQuery на стороне клиента, вы можете сделать что-то вроде этого:

$.get("/string", function(string) {
    alert(string)
})
5 голосов
/ 16 июля 2013

Я столкнулся со следующей ошибкой с кодом (nodejs 0.10.13), предоставленным амперсандом:

происхождение не разрешено access-control-allow-origin

Проблема была решена изменением

response.writeHead(200, {"Content-Type": "text/plain"});

до

response.writeHead(200, {
                 'Content-Type': 'text/html',
                 'Access-Control-Allow-Origin' : '*'});
0 голосов
/ 18 ноября 2016

Вот полностью функциональный пример того, что вы пытаетесь достичь. Я создал пример внутри hyperdev, а не jsFiddle, чтобы вы могли видеть код на стороне сервера и на стороне клиента.

Посмотреть код: https://hyperdev.com/#!/project/destiny-authorization

Просмотр рабочего приложения: https://destiny -authorization.hyperdev.space /

Этот код создает обработчик для запроса get, который возвращает случайную строку:

app.get("/string", function(req, res) {
    var strings = ["string1", "string2", "string3"]
    var n = Math.floor(Math.random() * strings.length)
    res.send(strings[n])
});

Этот код jQuery делает запрос ajax и получает случайную строку с сервера.

$.get("/string", function(string) {
  $('#txtString').val(string);
});

Обратите внимание, что этот пример основан на коде из ответа Джамунда Фергюсона, поэтому, если вы сочтете это полезным, не забудьте также заявить о нем. Я просто подумал, что этот пример поможет вам увидеть, как все сходится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...