Node.js 请求下载文件有时为空或不存在

Posted

技术标签:

【中文标题】Node.js 请求下载文件有时为空或不存在【英文标题】:Node.js request download file sometimes empty or no existing 【发布时间】:2013-07-09 10:02:01 【问题描述】:

我正在用 node.js 和请求模块编写一个下载器。使用我正在做的流语法

var r = request(url).pipe(fs.createWriteStream(targetPath));
r.on('error', function(err)  console.log(err); );
r.on('finish', cb);

下载文件,保存并调用回调。但是,在几乎 50% 的情况下,文件要么是空的,要么根本没有创建。不会发出 error 事件。即使文件尚未(完全)写入,似乎也触发了 finish 事件。

上下文:整个过程都包含在async.each 调用中。

有什么线索吗?谢谢!

【问题讨论】:

尝试通过添加.on('data' 侦听器进行调试,看看您是否一直在接收数据,但只是没有将数据写入磁盘。 【参考方案1】:

您需要在访问之前关闭该文件:

var file = fs.createWriteStream(targetPath);
var r = request(url).pipe(file);
r.on('error', function(err)  console.log(err); );
r.on('finish', function()  file.close(cb) );

顺便说一句,如果 url 回复任何 http 错误(例如未找到 404),则不会触发 'error' 事件,因此您可能应该单独检查:

function handleFailure(err)  console.log(err); ;

var file = fs.createWriteStream(targetPath);
request(url, function(error, response) 
    if (response.statusCode != 200) 
        console.log("oops, got a " + response.statusCode);
        return
    
    // close is async, and you have to wait until close completes otherwise
    // you'll (very rarely) not be able to access the file in the callback.
    file.on('finish', function()  file.close(cb) );

    response.pipe(file).on('error', handleFailure)
    file.on('error', handleFailure)
).on('error', handleFailure);

【讨论】:

以上是关于Node.js 请求下载文件有时为空或不存在的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 ViewBag 属性是不是为空或不存在

Symfony2,创建querybuilder where子句,不为空或不为空

BigQuery bq 命令 - 仅在表为空或不存在时加载

在 Java DB2 JDBC 中:如何在 SELECT 语句的 WHERE 子句中使用空参数,其中值可以为空或不为空?

在查询SQL语句中为空或不为空怎么写

node.js状态码