2013-01-01 5 views
0

J'essaie de télécharger et de demander un fichier .js en utilisant un script node.js, mais seule une partie du fichier est en cours de téléchargement.Le téléchargement du fichier Node.js est tronqué par l'instruction "require"

, c'est précisément la partie qui semble être la cause du problème:

response.on('data', function (chunk) { 
    out.write(chunk); 
    var theModule = require(__dirname + "/" + filename); 
    //less than half of the file is downloaded when the above line is included. 
}); 

Voici le code source complet:

var http = require('http'); 
var fs = require('fs'); 

downloadModule("functionChecker.js"); 

function downloadModule(filename) { 
    var google = http.createClient(80, 'www.google.com'); 
    var request = google.request('GET', '/svn/' + filename, { 
     'host': 'javascript-modules.googlecode.com' 
    }); 
    request.end(); 
    out = fs.createWriteStream(filename); 
    request.on('response', function (response) { 
     response.setEncoding('utf8'); 
     response.on('data', function (chunk) { 
      out.write(chunk); 
      var theModule = require(__dirname + "/" + filename); 
      //less than half of the file is downloaded when the above line is included. 
      //If the import statement is omitted, then the file is downloaded normally. 
     }); 
    }); 
} 
+0

Il semble que le téléchargement du fichier soit interrompu par la fonction "require", et le fichier est tronqué avant d'être entièrement téléchargé. Je n'ai toujours pas compris comment contourner ce problème. –

Répondre

1

L'événement data peut être appelé plusieurs fois. Vous devez attendre jusqu'à ce que toutes les données soient écrites.

response.setEncoding('utf8'); 
response.on('data', function (chunk) { 
    out.write(chunk); 
}); 
response.on('end', function(){ 
    out.end(); 
    var theModule = require(__dirname + "/" + filename); 
}); 

En outre, createClient est obsolète, comme mentionné dans the docs. Je recommande également d'utiliser pipe pour simplifier votre logique.

function downloadModule(filename) { 
    http.get({ 
    hostname: 'javascript-modules.googlecode.com', 
    path: '/svn/' + filename 
    }, function(res){ 
    var out = fs.createWriteStream(filename); 
    out.on('close', function(){ 
     var theModule = require(__dirname + "/" + filename); 
    }); 

    res.pipe(out); 
    }); 
} 
+0

Que fait la fonction 'pipe' ici? –

+0

Les documents @AndersonGreen sont ici: http://nodejs.org/api/stream.html#stream_stream_pipe_destination_options – loganfsmyth

+0

Existe-t-il un moyen de télécharger des fichiers de manière synchrone, plutôt que de manière asynchrone (comme indiqué ici)? –

Questions connexes