2

aws-sdkのcreateReadStream()を使用してノード内のS3からコンテンツをストリーミングしています。私たちはetagサポートを追加したいと思います。クライアントから「If-None-Match」ヘッダーを追加すると、s3はNotModifiedを処理できないエラーとしてスローします。etags(ノード)を使用したs3ストリーミング

retrieveFile = function(req, res) { 
    var s3 = new AWS.S3(); 
    var params = { 
     Bucket: bucket, 
     key: key 
    }; 
    if (req.get('If-None-Match')) { 
     params.IfNoneMatch = req.get('If-None-Match'); 
    } 
    return s3.getObject(params).on('httpHeaders', function(statusCode, headers) { 
     if (headers.etag) { 
      res.set('etag', headers.etag); 
     } 
     if (headers['content-length']) { 
      return res.set('content-length', headers['content-length']); 
     } 
    }).createReadStream().pipe(res); 
}; 

私は、ストリームのイベントをリッスンし、getObjectから返されたリクエストでコールバックを使用しようとしました。私はそのようなエラーのメッセージを得ることができますが、aws-sdkの何かが私のプロセスを殺しているようです。

/Projects/my-app/node_modules/aws-sdk/lib/request.js:31 
      throw err; 
      ^

NotModified: null 
    at Request.extractError (/Projects/my-app/node_modules/aws-sdk/lib/services/s3.js:519:35) 
    at Request.callListeners (/Projects/my-app/node_modules/aws-sdk/lib/sequential_executor.js:105:20) 
    at Request.emit (/Projects/my-app/node_modules/aws-sdk/lib/sequential_executor.js:77:10) 
    at Request.emit (/Projects/my-app/node_modules/aws-sdk/lib/request.js:673:14) 
    at Request.transition (/Projects/my-app/node_modules/aws-sdk/lib/request.js:22:10) 
    at AcceptorStateMachine.runTo (/Projects/my-app/node_modules/aws-sdk/lib/state_machine.js:14:12) 
    at /Projects/my-app/node_modules/aws-sdk/lib/state_machine.js:26:10 
    at Request.<anonymous> (/Projects/my-app/node_modules/aws-sdk/lib/request.js:38:9) 
    at Request.<anonymous> (/Projects/my-app/node_modules/aws-sdk/lib/request.js:675:12) 
    at Request.callListeners (/Projects/my-app/node_modules/aws-sdk/lib/sequential_executor.js:115:18) 
    at Request.emit (/Projects/my-app/node_modules/aws-sdk/lib/sequential_executor.js:77:10) 
    at Request.emit (/Projects/my-app/node_modules/aws-sdk/lib/request.js:673:14) 
    at Request.transition (/Projects/my-app/node_modules/aws-sdk/lib/request.js:22:10) 
    at AcceptorStateMachine.runTo (/Projects/my-app/node_modules/aws-sdk/lib/state_machine.js:14:12) 
    at /Projects/my-app/node_modules/aws-sdk/lib/state_machine.js:26:10 
    at Request.<anonymous> (/Projects/my-app/node_modules/aws-sdk/lib/request.js:38:9) 
    at Request.<anonymous> (/Projects/my-app/node_modules/aws-sdk/lib/request.js:675:12) 
    at Request.callListeners (/Projects/my-app/node_modules/aws-sdk/lib/sequential_executor.js:115:18) 
    at callNextListener (/Projects/my-app/node_modules/aws-sdk/lib/sequential_executor.js:95:12) 
    at IncomingMessage.onEnd (/Projects/my-app/node_modules/aws-sdk/lib/event_listeners.js:244:11) 
    at emitNone (events.js:91:20) 
    at IncomingMessage.emit (events.js:185:7) 
    at endReadableNT (_stream_readable.js:974:12) 
    at _combinedTickCallback (internal/process/next_tick.js:74:11) 
    at process._tickDomainCallback (internal/process/next_tick.js:122:9) 

答えて

2

ストリーム上でエラーがスローされ、あなたがAWS.Requestで聴いている場合は、エラーを受け取りますが、ストリームエラーがまだcatchedされていないようです。

この考えてみましょう:これは 'エラーイベントを!' が表示されます

s3.getObject({ 
    Bucket: 'foo', 
    Key: 'bar' 
}).on('error', function (err) { 
    console.log('Error event!'); 
}).createReadStream(); 

をエラーを投げてプロセスを終了します。これは、createReadStreamで作成されたストリームにもエラーが発生しているためです。ストリームオブジェクトにも

s3.getObject({ 
    Bucket: 'lalaland', 
    Key: 'blabaliets' 
}).on('error', function (err) { 
    console.log('Error event!'); 
}).createReadStream().on('error', function (err) { 
    console.log('Error event on stream!'); 
}); 

それはエラーのAWS.Requestオブジェクトに聞くでしょうが、

はこのことを考えてみましょう。これは、最初に 'Error event!'を表示し、次に 'Error event on stream!'を表示します。プロセスは終了しません。

なお、この:

s3.getObject({ 
    Bucket: 'lalaland', 
    Key: 'blabaliets' 
}).createReadStream().on('error', function (err) { 
    console.log('Error event on stream!'); 
}); 

ウィルのみ印刷 '!ストリーム上のエラーイベント'出口ではありません。この最後のオプションは、おそらくあなたが望むものです。ストリーム上のエラーだけを聞いて、要求オブジェクトでは聞きません。

元の意図に戻るには、この時点(ストリームのエラー時)には、実際にNotModifiedエラーであるかどうかをチェックし、res.status(304).end()のようなことをします。

関連する問題