2013-12-09 3 views
1

У меня есть фрагмент кода, который должен выполнить запрос http get. Программа прошла успешно без ошибок, но я не видел никакого ответа и даже не заходил в функцию обратного вызова! Сначала я подумал, что это потому, что http является асинхронным и в конце ставит большой цикл, но это тоже не сработало. Кто-нибудь знает эту проблему? Печатается только первый консольный журнал sendHttpRequest и 444. Я также пробовал http.get, но он тоже не работал.Nodejs http-запрос не работает

function sendHttpRequest (url, callBack) { 
    console.log("sendHttpRequest"); 
    //constrct options 
    var options = { 
     host: 'www.google.com', 
     path: '/index.html', 
     method: 'GET', 
     headers: { 
      'Content-Type': 'application/x-www-form-urlencoded' 
     } 
    }; 

    http.get("http://www.google.com/index.html", function(res) { 
     console.log("Got response: " + res.statusCode); 
    }); 

    var req = http.request(options, function(res) { 
     console.log("333"); 
     var output = ''; 
     console.log(options.host + ':' + res.statusCode); 
     res.setEncoding('utf8'); 

     res.on('data', function (chunk) { 
      console.log("DATATATAT!") 
      output += chunk; 
     }); 

     res.on('end', function() { 
      console.log('222'); 
      var obj = JSON.parse(output); 
      callBack(res.statusCode, obj); 
     }); 
    }); 

    req.on('error', function (err) { 
     console.log('error: ' + err.message); 
    }); 

    req.end(); 
    console.log("444"); 
    } 
} 
+0

Кто-то сказал, что Google не имеет «/ индекс .html ", я удалил его, но все равно это не сработало. Он просто не заходил в обратный вызов. Нет ответа. – user3084182

+0

Как вы это называете? У этого есть несколько проблем, но в остальном я вижу, что все функции 'console.log' и callback также вызываются. Вы также возвращаете HTML, который 'JSON.parse' никогда не будет работать. – matth

+0

@ making3 Привет, я завернул это как модуль и вызвал его из задачи grunt, но почему-то я вижу только первый консольный журнал и последний, который равен 444. Должен ли я вызывать асинхронный вызов либо в grunt, либо в этом модуле? ждать ответа? Благодаря! Для части json, изначально я собирался разобрать json, чтобы это не было проблемой. – user3084182

ответ

4

Обновление

черновой задача завершается до того, как ОП получил ответ; добавив async и обратный вызов к задаче исправил его.


Если взять код за пределами функции и предварять var http = require('http'); я не получаю ответа вплоть до 222, после чего он умирает с SyntaxError: Unexpected token <. Который фактически умирает, потому что вы пытаетесь проанализировать ответ HTML как JSON.

Если вставить весь скрипт ниже и запустить его конец к концу, консоль умирает с:

undefined:1 
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8"> 
^ 
SyntaxError: Unexpected token < 
    at Object.parse (native) 
    at IncomingMessage.<anonymous> (/Users/you/nodetest/tmp/test.js:31:28) 
    at IncomingMessage.EventEmitter.emit (events.js:120:20) 
    at _stream_readable.js:896:16 
    at process._tickCallback (node.js:599:11) 

Сценарий:

var http = require('http'); 

console.log("sendHttpRequest"); 
//constrct options 
var options = { 
    host: 'www.google.com', 
    path: '/index.html', 
    method: 'GET', 
    headers: { 
     'Content-Type': 'application/x-www-form-urlencoded' 
    } 
}; 

http.get("http://www.google.com/index.html", function(res) { 
    console.log("Got response: " + res.statusCode); 
}); 

var req = http.request(options, function(res) { 
    console.log("333"); 
    var output = ''; 
    console.log(options.host + ':' + res.statusCode); 
    res.setEncoding('utf8'); 

    res.on('data', function (chunk) { 
     console.log("DATATATAT!") 
     output += chunk; 
    }); 

    res.on('end', function() { 
     console.log('222'); 
     // it's failing on the next line, because the output 
     // it's receiving from Google is HTML, not JSON. 
     // If you comment out this line and simply 
     // "console.log(output)" you'll see the HTML response. 
     var obj = JSON.parse(output); 
     callBack(res.statusCode, obj); 
    }); 
}); 

req.on('error', function (err) { 
    console.log('error: ' + err.message); 
}); 

req.end(); 
console.log("444"); 
+0

Привет, я завернул это как модуль и вызвал его из задачи grunt, но почему-то я вижу только первый консольный журнал и последний, который равен 444. Должен ли я вызывать асинхронный вызов либо в grunt, либо в этом модуле? ждать ответа? Благодаря! Для части json, изначально я собирался разобрать json, чтобы это не было проблемой. – user3084182

+0

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

+0

Оказывается, вы правы! Задача grunt прекратилась до того, как я получил ответ! Я добавил асинхронный вызов и обратный вызов, и он сработал. Огромное спасибо!! :) – user3084182

Смежные вопросы