2017-01-05 5 views
0

Я работаю над парсером в nodejs. Поэтому я запрашиваю веб-сайт и разбираю HTML. Я работаю с требованием («htmlparser») и требую («follow-redirects»). Http для запросов.Функция Nodejs вызывается несколько раз

requestSite(options); 
console.log("Done\n"); 
parser.done(); 

function requestSite(options) { 
http.get(options, function(res) { 
    console.log("Got response: " + res.statusCode); 
    res.setEncoding('utf8'); 
    res.on('data', function (chunk) { 
      parser.parseChunk(chunk.toString('utf8')); 
    }); 
}).on('error', function(e) { 
    console.log("Got error: " + e.message); 
}); 
} 

Моя проблема сейчас в том, что сделано() вызывается до того, как функция requestSite фактически закончил свои куски в результате следующей ошибки:

Writing to the handler after done() called is not allowed without calling a reset()

Как я могу ждать ломти закончить?

+0

есть событие on ('end'), которое вы можете назвать ? – ojf

ответ

0

Вы не учитываете асинхронный характер nodejs. Он вызовет requestSite, а затем moveon для выполнения следующего оператора и вызовет parser.done до завершения requestSite. Сделайте это вместо этого.

requestSite(options, parser); 
console.log("Done\n"); 

function requestSite(options, parser) { 
http.get(options, function(res) { 
    console.log("Got response: " + res.statusCode); 
    res.setEncoding('utf8'); 
    res.on('data', function (chunk) { 
      parser.parseChunk(chunk.toString('utf8')); 
    }) 
    .on("end", function(){ 
      parser.done(); 
     }) 
}).on('error', function(e) { 
    console.log("Got error: " + e.message); 
}); 
} 
0

ну, это основные из node.js и архитектуры, управляемой событиями.

узла не является прямой линией, как программирование PHP, Python и т.д. ...

взгляда на этом простой примере:

console.log(1); 
setTimeout (function(err, res) { 
    console.log(2); 
}, 0); 
console.log(3); 

, как вы думаете, он должен печатать: 1,2,3

, но это напечатает 1,3,2.

В вашем примере вы должны переместить

parser.done(); 

к «концу» запроса HTTP. В настоящее время у вас есть событие для получения кусков данных, поэтому просто используйте: onEnd или что-то подобное, а не место «parser.done()»

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