考慮下面的代碼:如何阻止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的正確大小,兩者都可以下載並且都可以工作。
如果上傳量較小,則不會發生重複。這種行爲的原因是什麼?如何解決它?