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

时间:2011-08-28 18:25:00

标签: node.js

我正在尝试利用node-request module,但文档并不是很好。如果我向有效资源发出请求并将其传递给Writable Stream,那么一切正常。但是,如果我向无效对象发出请求,则仍会创建可写流。例如,请使用以下代码段:

var x = request("http://localhost:3000/foo.jpg");
var st = fs.createWriteStream("foo.jpg");
x.pipe(st);

如果服务器上存在foo.jpg资源,则数据通过管道传输到流,并在服务器上创建文件。但是,如果服务器上存在foo.jpg ,则仍会创建空白容器文件。似乎没有任何错误事件或任何可用于确定请求是否返回404的内容。我尝试过以下内容:

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

还有:

request("http://localhost:3000/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等),请不要管道文件;如果请求有效,则管道文件。有什么建议吗?

4 个答案:

答案 0 :(得分:43)

我写了请求:)

您可能想尝试这个

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

答案 1 :(得分:22)

我最终成功获得节点中的新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{  }
    })
}

这非常灵活 - 如果你想重试,可以用setTimeout递归调用函数

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)
       }
    })
}

答案 2 :(得分:5)

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

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.
})

答案 3 :(得分:-5)

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

它有一个“错误”事件,可用于捕获错误。