Node.js - 在管道响应之前检查流是否有错误

时间:2015-08-05 23:13:21

标签: javascript node.js stream

在Node.js中,假设我想从某个地方读取文件并流式传输响应(例如,使用fs.createReadStream()从文件系统中传输)。

application.get('/files/:id', function (request, response) {
    var readStream = fs.createReadStream('/saved-files/' + request.params.id);
    var mimeType = getMimeTypeSomehow(request.params.id);
    if (mimeType === 'application/pdf') {
        response.set('Content-Range', ...);
        response.status(206);
    } else {
        response.status(200);
    }
    readStream.pipe(response);
});

但是,我想在发送响应标头之前检测流是否有错误。我该怎么做?

伪代码:

application.get('/files/:id', function (request, response) {
    var readStream = fs.createReadStream('/saved-files/' + request.params.id);
    readStream.on('ready', function () {
        var mimeType = getMimeTypeSomehow(request.params.id);
        if (mimeType === 'application/pdf') {
            response.set('Content-Range', ...);
            response.status(206);
        } else {
            response.status(200);
        }
        readStream.pipe(response);
    });
    readStream.on('error', function () {
        response.status(404).end();
    });
});

1 个答案:

答案 0 :(得分:5)

当readStream结束或出错时,写入流结束。您可以在管道期间传递gulp.dest并手动结束写入流来阻止此默认行为。

因此,即使发生错误,您的写入流仍处于打开状态,您可以在end:false回调中使用writestream执行其他操作(例如,发送404状态)。

error

更新1 :对于文件流,您可以侦听var readStream = fs.createReadStream('/saved-files/' + request.params.id); readStream.on('error', function () { res.status(404).end(); }); readStream.on('end', function(){ res.end(); //end write stream manually when readstream ends }) readStream.pipe(res,{end:false}); // prevent default behaviour 事件以检查文件是否可以阅读:

open

更新2 :正如OP提到的,其他流可能没有readStream.on('open', function () { // set response headers and status }); 事件,如果流是从节点的流模块继承的,我们可能会使用以下内容。诀窍是我们手动编写数据而不是open方法。这样我们就可以做一些初始化'在开始写第一个字节之前写入。

所以我们首先绑定pipe()然后绑定once('data')。第一个将在实际写作发生之前被调用。

on('data')