2015-12-02 27 views
0

考慮下面的代碼:如何阻止Express.js複製長多部分請求?

var routes = function(app) { 
    app.post('/api/video', passport.authenticate('token', authentication), video.createVideo); 
} 

function createVideo(request, response) { 
    logger.info('starting create video'); 
    upload(request, response, function(err) { 
    logger.info('upload finished', err); 
    //callback omitted for brevity 
    } 
} 

上傳是multer與multer-S3中間件:

var upload = multer({ 
    storage: s3({ 
    dirname: config.apis.aws.dirname, 
    bucket: config.apis.aws.bucket, 
    secretAccessKey: config.apis.aws.secretAccessKey, 
    accessKeyId: config.apis.aws.accessKeyId, 
    region: config.apis.aws.region, 
    filename: function(req, file, cb) { 
     cb(null, req.user._id + '/' + uuid.v4() + path.extname(file.originalname)); 
    } 
    }), 
    limits: { 
    fileSize: 1000000000 
    }, 
    fileFilter: function(req, file, cb) { 
    if (!_.contains(facebookAllowedTypes, path.extname(file.originalname))) { 
     return cb(new Error('Only following types are allowed: ' + facebookAllowedTypes)); 
    } 

    cb(null, true); 
    } 
}).fields([{ 
    name: 'video', 
    maxCount: 1 
}]); 

上面的代碼執行以下操作:它需要是從什麼地方發出的文件,並將其流到AWS S3實例。 multer-s3在後臺使用s3fs來創建寫入流,並將文件作爲5MB多部分發送。

對於大文件,如300MB,可能需要幾分鐘才能上傳。現在發生了一件奇怪的事情。我可以在我們的前端看到,它只在/ api/video上發送一個POST請求。其實我也試過用郵差來提出請求,不信任我們的前端。

它開始上傳,但約2分鐘後開始第二次上傳!如果我嘗試上傳較小的文件,例如2-100MB,則不會發生任何類型的錯誤。這是從我的日誌(來自上面的代碼):

{「name」:「test-app」,「hostname」:「zawarudo」,「pid」:16953,「level」:30,「 msg「:」開始創建視頻「,」時間「:」2015-12-02T14:08:22.243Z「,」src「:{」file「:」/ home/areinu/dev/projects/test-app-uploader /backend/app/services/videoService.js","line":169,"func":"createVideo"},"v":0"

{「name」:「test-app」,「hostname 「:」zawarudo「,」pid「:16953,」level「:30,」msg「:」開始創建視頻「,」時間「:」2015-12-02T14:10:28.794Z「,」src「:{ 「文件」: 「/家/ areinu的/ dev /項目/測試應用程序的上傳/後端/應用程序/服務/ videoService.js」, 「線」:169, 「功能」: 「createVideo」}, 「v」: 0}

{「na me「:」test-app「,」hostname「:」zawarudo「,」pid「:16953,」level「:30,」msg「:」upload finished undefined「,」time「:」2015-12-02T14: 12:46.433Z 「 」SRC「:{ 」文件「: 」/家/ areinu的/ dev /項目/測試應用程序的上傳/後端/應用程序/服務/ videoService.js「, 」線「:171},」 v「:0}

{」name「:」test-app「,」hostname「:」zawarudo「,」pid「:16953,」level「:30,」msg「:」upload finished undefined「, 「時間」: 「2015-12-02T14:12:49.627Z」, 「SRC」:{ 「文件」:「/家/ areinu的/ dev /項目/測試應用程序的上傳/後端/應用程序/服務/ videoService。 js「,」line「:171},」v「:0}

正如你可以看到兩個上傳結束後幾秒鐘,但第二個在2分鐘後開始。問題是 - 應該只有一個上傳!

我在郵遞員所做的一切都設置了我的訪問令牌(所以護照授權我)並添加了一個文件。這應該只創建1個上傳,同時發生2個,並且都上傳相同的文件。

此外,請注意,兩個文件都已上傳,兩者都有不同的uuids(通知文件名函數會創建uuid中的文件名),都出現在s3上,並且都具有300MB的正確大小,兩者都可以下載並且都可以工作。

如果上傳量較小,則不會發生重複。這種行爲的原因是什麼?如何解決它?

回答

0

問題很簡單(我只花了整整一天的時間就搞清楚了)。這只是節點請求的默認超時 - 2分鐘。我不知道爲什麼它開始另一個,也不知道爲什麼它實際上工作,但將我的服務器上的默認超時設置爲10分鐘解決了問題。

如果有人知道爲什麼超時請求實際完成(和兩次),請讓我知道。那麼我會改進答案。