2017-08-29 3 views
1

Je charge un fichier .ndjson via https. Je veux le fermer après avoir lu 100 lignes du fichier.Comment fermer un flux https dans Node.js

const amount = 100; 
    https.get(url, (res) => { 
    var { statusCode } = res; 

    if (statusCode !== 200) { 
     throw new Error(`Request Failed.\n Status Code: ${statusCode}`); 
    } 

    res.setEncoding('utf8'); 
    let rows = []; 
    res 
     .pipe(ndjson.parse()) 
     .on('data', function (obj) { 
     rows.push(obj); 
     if (rows.length === amount) { 
      this.end(); 
     } 
     }) 
     .on('end',() => { 
     resolve(rows); 
     }); 
    }).on('error', (e) => { 
    throw new Error(e.message); 
    }); 

Mais tous les sens, j'ai essayé la fin du flux, le même message d'erreur apparaît:

Error: Could not parse row {"username"... 
    at DestroyableTransform.parseRow [as mapper] (C:\Users\thoma\Documents\GitHub\test\node_modules\ndjson\index.js:19:28) 
    at DestroyableTransform.flush [as _flush] (C:\Users\thoma\Documents\GitHub\test\node_modules\split2\index.js:44:21) 
    at DestroyableTransform.<anonymous> (C:\Users\thoma\Documents\GitHub\test\node_modules\readable-stream\lib\_stream_transform.js:138:49) 
    at Object.onceWrapper (events.js:314:30) 
    at emitNone (events.js:105:13) 
    at DestroyableTransform.emit (events.js:207:7) 
    at prefinish (C:\Users\thoma\Documents\GitHub\test\node_modules\readable-stream\lib\_stream_writable.js:596:14) 
    at finishMaybe (C:\Users\thoma\Documents\GitHub\test\node_modules\readable-stream\lib\_stream_writable.js:604:5) 
    at afterWrite (C:\Users\thoma\Documents\GitHub\test\node_modules\readable-stream\lib\_stream_writable.js:470:3) 
    at _combinedTickCallback (internal/process/next_tick.js:144:20) 

Et le courant fonctionne très bien quand pas avec force fermée, de sorte qu'il ne soit pas lié à la ndjson fichier. Est-il possible de fermer le flux au milieu de la requête?

Répondre

0

Il existe plusieurs solutions:

  1. Envoyer un en-tête pour fermer la connexion: this.set("Connection", "close")
  2. Fin flux grâce à this.end()

Je ne sais pas lequel est le meilleur. Donc, dans votre exemple, vous avez un problème dû à this (je vous recommande de jeter un oeil à ce lien). Essayez le code suivant:

res 
    .pipe(ndjson.parse()) 
    .on('data', obj => { 
    rows.push(obj); 
    if (rows.length === amount) { 
     this.end(); 
    } 
    }) 
    .on('end',() => { 
    resolve(rows); 
    });