2

busboy モジュールを使用してファイルをアップロードしています。1つのファイルに対して非常にうまく機能します。ただし、複数のファイルをアップロードしようとすると、次のエラーがスローされます。

Error: Can't set headers after they are sent

スローエラーの理由はわかっていますが、解決策がわかりません。以下は私のコードスニペットです。

  exports.uploadFile = function (req, res) {
     console.log('Calling uploadFile inside FileUploadService');
     var fstream;
     req.pipe(req.busboy);

     req.busboy.on('file', function (fieldName, file, fileName) {
         // Get folderGuid
         var folderGuid = req.params.folderGuid;
         //Get folderName
         var folderName = req.query.folderName;
         //path of file contents
         var directoryPath = fileRepositoryPath + "/" + folderGuid+"/"+folderName;
         //Get location
         var filePath = directoryPath + "/" + fileName;
         log.debug("inside FileUploadService ::: uploadFile >> folderGuid:  " + folderGuid + ", directoryPath : " + directoryPath + ", filePath : " + filePath);
         //Create directory
         nodefs.mkdir(directoryPath, 0777, true, function (err) {
             if (err) {
                 log.error({err: err}, 'Error while creating recurrisve directory');
             } else {
                 log.debug('inside FileUploadService ::: uploadFile >> Directory created');
             }
             //Write object on file system
             fstream = nodefs.createWriteStream(filePath);
             file.pipe(fstream);
             fstream.on('close', function (err) {

                 if (!err) {
                     var relativePath = "/" + folderGuid + "/" + fileName;
                     log.info('Successfully uploaded file relativePath >> '+relativePath); 
                     res.status(constants.HTTP_CODE_OK);
                     res.json({"relativePath": relativePath});
                 } else {
                     log.error({err: err}, 'Failed to upload file');
                     res.status(constants.HTTP_CODE_INTERNAL_SERVER_ERROR);
                     res.json({error: err});
                 }
             });

         });
     });

 };

次のコード行がエラーをスローしていることはわかっています。これは、複数のファイルの場合、このコード行が 2 回実行されてエラーが発生するためです。

 res.status(constants.HTTP_CODE_OK);
 res.json({"relativePath": relativePath});

「 」の複数のイベントを追跡req.busboy.on('file', function (fieldName, file, fileName)して、すべてのファイル処理が終了したら、私だけが応答を送信するようにするにはどうすればよいですか?

助けてください。

4

2 に答える 2

1

Busboy は一度に 1 つのファイルを処理するため、コードによると、1 つのファイル ストリーミングの完了後に応答が送信されます。次のファイル ストリーミングの完了時に、応答が既に送信されているため、このエラーが発生しています。

すべてのファイルが完了したら、応答を送信してみてください。

  req.busboy.on('finish', function() {
    res.status(constants.HTTP_CODE_OK);
    res.json({"relativePath": relativePath});
  });

または、この質問の回答のように試してください: busboy-connect fires on finish before the end of save file (node.js , express)

于 2016-01-28T07:28:59.807 に答える