2015-12-02 2 views
0

Consultez le code suivant:Que faire pour empêcher Express.js de dupliquer des requêtes longues en plusieurs parties?

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 
    } 
} 

Upload est multer avec middleware 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 
}]); 

Le code ci-dessus fait ce qui suit: il faut un fichier qui est envoyé à partir de quelque part et les flux à AWS S3 instance. multer-s3 utilise s3fs en arrière-plan pour créer un flux d'écriture et envoyer le fichier sous forme de multiparts de 5 Mo.

Avec de gros fichiers, comme 300 Mo, le téléchargement peut prendre quelques minutes. Et maintenant quelque chose de vraiment étrange arrive. Je peux voir dans notre interface qu'il envoie une seule requête POST sur/api/video. En fait, j'ai également essayé d'utiliser Postman pour faire la demande, ne pas faire confiance à notre interface.

Il démarre le téléchargement, mais après environ 2 minutes, il démarre le 2e téléchargement! Si je tente de télécharger des fichiers plus petits, comme 2-100 Mo alors rien de ce genre se passe. Ceci est de mes journaux (du code ci-dessus):

{ "name": "test-app", "nom d'hôte": "zawarudo", "pid": 16953, "niveau": 30 » msg ":" commencer à créer la vidéo "," temps ":" 2015-12-02T14: 08: 22.243Z "," src ": {" fichier ":"/home/areinu/dev/projets/test-app-uploader /backend/app/services/videoService.js","line":169,"func":"createVideo"},"v":0}

{"nom": "test-app", "nom d'hôte" ":" zawarudo "," pid ": 16953," niveau ": 30," msg ":" début de la vidéo "," temps ":" 2015-12-02T14: 10: 28.794Z "," src ": { "fichier": "/ home/areinu/dev/projets/test-app-uploader/backend/app/services/videoService.js", "line": 169, "func": "createVideo"}, "v": 0}

{"na moi ":" test-app "," nom d'hôte ":" zawarudo "," pid ": 16953," niveau ": 30," msg ":" téléchargement terminé indéfini "," temps ":" 2015-12-02T14: 12: 46.433Z "," src ": {" fichier ":"/home/areinu/dev/projets/test-app-uploader/backend/app/services/videoService.js "," ligne ": 171}," v ": 0}

{" nom ":" test-app "," nom d'hôte ":" zawarudo "," pid ": 16953," niveau ": 30," msg ":" upload terminé undefined ", "time": "2015-12-02T14: 12: 49.627Z", "src": {"file": "/ home/areinu/dev/projets/test-app-uploader/backend/app/services/videoService. js "," line ": 171}," v ": 0}

Comme vous pouvez le voir, les deux téléchargements se terminent quelques ms après l'autre, mais le second démarre après 2 minutes. Le problème est - il devrait y avoir un seul téléchargement! Tout ce que j'ai fait dans le facteur, c'est mon jeton d'accès (donc le passeport m'autorise) et j'ai ajouté un fichier. Cela devrait créer seulement 1 téléchargement, pendant ce temps 2 se produisent, et les deux télécharger le même fichier. Notez également que les deux fichiers sont téléchargés, les deux ont des uuids différents (la fonction de nom de fichier crée les noms de fichiers de uuid), apparaissent tous les deux sur s3 et ont une taille de 300Mo, les deux peuvent être téléchargés.

Si le téléchargement est plus petit, la duplication ne se produit pas. Quelle est la raison de ce comportement? Comment le réparer?

Répondre

0

Le problème était très simple (je n'ai passé qu'une journée entière à le comprendre). C'est juste le délai d'expiration par défaut des requêtes de nœud - 2 minutes. Je ne sais pas pourquoi il a commencé un autre ni pourquoi cela a fonctionné, mais le réglage du délai par défaut sur mon serveur à 10 minutes a résolu le problème.

Si quelqu'un sait pourquoi les demandes expirées se sont effectivement terminées (et deux fois) s'il vous plaît faites le moi savoir. Je vais améliorer la réponse alors.