fs.createReadStream et .pipe()
Je suis en train de poster un gros fichier à un autre serveur à l'aide de request.post()
de la trousse de demande en Node.js et j'obtiens:
(node) warning: Recursive process.nextTick detected. This will break in the next version of node. Please use setImmediate for recursive deferral.
RangeError: Maximum call stack size exceeded
J'ai pensé que c'est parce que c'est un gros fichier (80 MO) parce que les plus petits fichiers, beau travail, je suis donc maintenant essayer de mettre en œuvre un flux:
var options = {
url: aURLIHaveDefined,
headers: {
'User-Agent': 'MyRestAPI'
},
auth: {
username: creds.username,
password: creds.password
},
strictSSL: false,
json: true
}
var readStream = fs.createReadStream(filePathIHaveDefined);
readStream.pipe(options);
Et j'obtiens l'erreur:
TypeError: Object #<Object> has no method 'on'
Personne ne sait la syntaxe pour inclure les options dans le tuyau et pourquoi j'obtiens cette erreur?
Mise à JOUR (après sousa commentaire):
J'ai essayé:
readStream.pipe(request(options));
readStream.on('end', function() {
console.log('end of readStream'+fileName);
});
Il n'a pas d'erreur, mais il ne semble pas faire quoi que ce soit. Le programme s'exécute et je ne vois jamais de console.log()
?
Mise à JOUR #2:
En utilisant le manuel d'aide ici, a constaté que vous pouvez faire ceci:
fs.createReadStream('file.json').pipe(request.put('http://....'))
J'ai donc ajouté le request.post()
à l'intérieur du tuyau et il semble que j'y suis presque! Aide:
readStream.pipe(
request.post(options,
function(error, response, data) {
if (error) {
console.log(": Cannot upload file to " + creds.server + " due to " + error);
setImmediate(failureCallback(error));
} else {
console.log(": file uploaded to " + data);
//send back data, which is url of uploaded file
setImmediate( successCallback(data) );
}
}
)
);
Je reçois un message d'erreur indiquant que la longueur doit être connue:
Apache Tomcat/5.5.17 - rapport d'Erreur d'État HTTP 411 - Longueur Requise
sa demande ne peut être traitée sans un contenu défini par la longueur (la Longueur
Requis).
OriginalL'auteur SOUser | 2014-02-21
Vous devez vous connecter pour publier un commentaire.
Les options var doit être un ruisseau. Vous devez faire quelque chose comme ceci:
Vous êtes à la tuyauterie à un objet, c'est pourquoi vous n'avez pas de méthode
on
.La fin de votre événement n'est pas déclenché. Probablement votre demande ne fonctionne pas correctement, ce qui signifie que le readStream n'atteint jamais la fin. C'est un related post
essayez d'obtenir votre
end
événement à partir de la lecture de flux de fichiers comme ceci: readStream.('fin', function () { console.log ("fin!') }); readStream.tuyau de processus.stdout); Si cela fonctionne, alors vous êtes probablement fait quelque chose de mal avec votrerequest
.Hey, je pense que le problème est qu'il faut le demander.post() donc en fait je post quelque chose, mais j'ai toujours l'erreur de longueur décrites ci-dessus. Merci pour coller avec ce que nous proximité!
Je vais essayer cette forme de données approche maintenant: github.com/mikeal/request/issues/396
OriginalL'auteur sousa
Pour La Mise À Jour #2:
Demande github dit
"demande de tuyau à lui-même. Ce faisant, le content-type et content-length sont conservés à la METTRE en-têtes"
Je n'ai pas besoin de définir des en-têtes, cependant, si Apache Tomcat est de se plaindre, vous pouvez toujours régler la Longueur du Contenu comme suit:
Puis dans l'option en-têtes:
OriginalL'auteur user2821716