Проблема получения ответа от сервера узла с помощью пост-запроса ajax - PullRequest
1 голос
/ 17 февраля 2011

Я написал http-сервер, используя узел js

var sys = require("sys"),
    http = require("http"),
    url = require("url"),
    path = require("path"),
    fs = require("fs");



http.createServer(function(request, res) {

    var parsed_url = url.parse(request.url);
    var uri = parsed_url.pathname;
   if(uri === "/test"){

  res.writeHead(200, {'Content-Type': 'text/javascript'});

      request.addListener('data', function (chunk) {
          var data = eval("(" + chunk + ")");
          console.log(data[0].id);
      })
      request.addListener('end', function() {
          console.log('end triggered');
          res.write("Post data");
          res.end();
      }); 
   }
}).listen(8080);

, и я пытаюсь отправить ответ на запрос ajax, но я не могу получить ответ.Вот код для запроса ajax,

    var myhttp = new XMLHttpRequest();
    var url = "http://localhost:8080/test";

    var data = [{"a":"1"},{"b":"2"},{"c":"3"}];

    var dataJson = JSON.stringify(data);
    myhttp.open('POST', url, true);
    myhttp.send(dataJson);
    myhttp.onreadystatechange = function() {        
        if ((myhttp.readyState == 4) && (myhttp.status == 200)){
            alert(myhttp.responseText);
        }
        else if ((myhttp.readyState == 4) && (myhttp.status != 200))
        {
            console.log("Error in Connection");
        }

Может кто-нибудь помочь мне, что я делаю неправильно ...

Спасибо Vinay

Ответы [ 2 ]

3 голосов
/ 17 февраля 2011

Ваш код почти верен, но в вашем примере кода у вас есть

console.log(data[0].id)

данные объект имеет нет свойство id такесли у вас есть только

console.log(data[0])

, у вас есть ответ типа

{ a: '1' }

, поэтому вы можете получить доступ к свойству a , выполнив

console.log(data[0].a);

ОБНОВЛЕНО Обновлен с полным примером

Еще одна вещь - это то, что вы используете eval , а узел поставляется с JSON.parse комплектом стак вот фрагмент кода ниже, как я заставил его работать

Файл: app.js

var sys = require("sys"),
    http = require("http"),
    url = require("url"),
    path = require("path"),
    fs = require("fs");



http.createServer(function(request, res) {    
   var parsed_url = url.parse(request.url);
   var uri = parsed_url.pathname;

   if(uri === "/test"){

      res.writeHead(200, {'Content-Type': 'text/javascript'});
      request.addListener('data', function (chunk) {
          // removed this - eval("(" + chunk + ")");
          var data = JSON.parse(chunk);    
          console.log(data[0].a);
      })
      request.addListener('end', function() {
          console.log('end triggered');
          res.write("Post data");
          res.end();
      });              

   } else if(uri === "/") {
       fs.readFile("./index.html",function(err, data){
         if(err) throw err;
          res.writeHead(200, {'Content-Type': 'text/html'});
          res.end(data);
       });    
   }

}).listen(8080); 

В том же каталоге создайте файл index.html со следующим:

<html>
<head>
    <script type="text/javascript" charset="utf-8">
         var myhttp = new XMLHttpRequest();
       var url = "http://localhost:8080/test";

       var data = [{"a":"1"},{"b":"2"},{"c":"3"}];
       var dataJson = JSON.stringify(data);

       myhttp.open('POST', url, true);
       myhttp.send(dataJson);
       myhttp.onreadystatechange = function() {        
           if ((myhttp.readyState == 4) && (myhttp.status == 200)){
               alert(myhttp.responseText);
           }
           else if ((myhttp.readyState == 4) && (myhttp.status != 200))
           {
               console.log("Error in Connection");
           }
       }
    </script>
</head>
<body>
</body>
</html>       

Это полный рабочий пример того, что вы хотите.

Относительно тех же проблем с политикой происхождения, которые у вас были, в основном из-за того, что вы не можете POST-данные между двумя разными доменами через ajax, еслиВы используете некоторые трюки с iframes, но это другая история.

Также я думаю, что это хорошо для всехo понять основы технологии, прежде чем переходить к фреймворкам, так что честная игра для вас.

удачи

2 голосов
/ 17 февраля 2011

Вы должны прочитать данные по-другому.Отправленные данные поступают на сервер узла частями (событие «данные»), которые необходимо собирать до тех пор, пока не сработает событие «конец».Внутри этого события вы можете получить доступ к своей полезной нагрузке.

var body = '';

request.addListener('data', function (chunk) {
  body += chunk;
});

request.addListener('end', function() {
  console.log(body);
  res.write('post data: ' + body);
});

Дополнительно, кажется, есть некоторые проблемы с вашим клиентским кодом (особенно в отношении проверки кода состояния), но я не могудействительно помогу вам с этим, так как я всегда работаю с такими фреймворками, как jQuery для управления асинхронными запросами.

Если вы хотите создавать надежные серверы node.js для веб-использования, я настоятельно рекомендуюпроизводительность HTTP-Framework Express .Это снимает много боли при разработке веб-серверного приложения в узле и поддерживается активно.

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