Düğüm ve Cheerio ile bir web kazıyıcı inşa ediyorum ve belirli bir web sitesi için aşağıdaki hatayı alıyorum (sadece bu web sitesinde olur, kazımayı denediğim başkaları yok.
Her seferinde farklı bir yerde olur, bu yüzden bazen url xhatayı atar, diğer zamanlar url xiyidir ve tamamen farklı bir url'dir:
Error!: Error: socket hang up using [insert random URL, it's different every time]
Error: socket hang up
at createHangUpError (http.js:1445:15)
at Socket.socketOnEnd [as onend] (http.js:1541:23)
at Socket.g (events.js:175:14)
at Socket.EventEmitter.emit (events.js:117:20)
at _stream_readable.js:910:16
at process._tickCallback (node.js:415:13)
Hata ayıklamak çok zor, nereden başlayacağımı gerçekten bilmiyorum. Başlamak için ne IS bir yuva hatası asmak? 404 hatası mı yoksa benzeri mi? Yoksa sadece sunucunun bir bağlantıyı reddettiği anlamına mı geliyor?
Bunun hiçbir yerinde bir açıklama bulamıyorum!
EDIT: İşte (bazen) hataları döndüren bir kod örneği:
function scrapeNexts(url, oncomplete) {
request(url, function(err, resp, body) {
if (err) {
console.log("Uh-oh, ScrapeNexts Error!: " + err + " using " + url);
errors.nexts.push(url);
}
$ = cheerio.load(body);
// do stuff with the '$' cheerio content here
});
}
Bağlantıyı kapatmak için doğrudan bir çağrı yoktur, ancak Node Requesthangisini (anlayabildiğim kadarıyla) kullandığı için kullanıyorum http.get, bu gerekli değildir, eğer yanılıyorsam beni düzeltin!
DÜZENLEME 2: İşte hatalara neden olan gerçek, kullanımda bir kod parçası. prodURLve diğer değişkenler çoğunlukla daha önce tanımlanan jquery seçicileridir. Bu, asyncDüğüm için kitaplığı kullanır .
function scrapeNexts(url, oncomplete) {
request(url, function (err, resp, body) {
if (err) {
console.log("Uh-oh, ScrapeNexts Error!: " + err + " using " + url);
errors.nexts.push(url);
}
async.series([
function (callback) {
$ = cheerio.load(body);
callback();
},
function (callback) {
$(prodURL).each(function () {
var theHref = $(this).attr('href');
urls.push(baseURL + theHref);
});
var next = $(next_select).first().attr('href');
oncomplete(next);
}
]);
});
}
requestbelirli bir http.requestistek değil , düğüm hizmetini kullanıyorum (sanırım, düğüm için çok yeniyim!). Bu: github.com/mikeal/request Bu, isteği otomatik olarak bitirmiş gibi görünüyor, değil mi? EDIT: Belgelere göre http method, defaults to GET, sorun bu değil.
cheerio.load, zaman uyumsuzdur. Yani $ ile bir şeyler yapmaya başlamadan önce bitmeyebilir.
hang up anlamına gelir ; eski moda telefonu asmaktan kaynaklanıyor.
endzaman aşımı süresi içinde bağlantı olayı göndermediği anlamına gelir .http.request(Değilhttp.get) üzerinden cheerio için istek alıyorsanız .request.end()İsteği göndermeyi bitirmek için aramak zorundasınız .