Layout of a zip response with fetch-mock

I tried with the following code:

require( 'isomorphic-fetch' ); const fetchMock = require( 'fetch-mock' ), fsp = require( 'fs-promise' ), unzip = require( 'unzip' ), rimraf = require( 'rimraf-then' ), path = require( 'path' ); let zipLink = 'https://github.com/stevemao/left-pad/archive/master.zip', out = 'left-pad-master'; // Careful: lib might be removed at any moment. fetchMock.get( zipLink, fsp.createReadStream( path.join( __dirname, 'left-pad-master.zip' ) ) ); rimraf( out ) .then( () => fetch( zipLink ) ) .then( response => { return new Promise( ( resolve, reject ) => { // For example purpose, just parse zip file, and log each entry. response.body.pipe( unzip.Parse() ) .on( 'entry', ( entry ) => console.log( entry.path ) ) .on( 'close', resolve ) .on( 'error', reject ); } ); } ) .then( () => console.log( 'done' ) ) .catch( console.log ); 

But he throws:

 Error: invalid signature: 0x725f227b at C:\dev\unzip-mock\node_modules\unzip\lib\parse.js:59:13 at runCallback (timers.js:628:20) at tryOnImmediate (timers.js:601:5) at processImmediate [as _immediateCallback] (timers.js:578:5) 

If you comment out the call to fetchMock.get and work with real fetch , it works well.

The code is available at https://github.com/mlewand/unzip-mock-example

+5
source share
1 answer

Pass the Response instance as the second parameter to fetchMock.get() , where the body of the response object is the stream of the local file:

 require( 'isomorphic-fetch' ); const fetchMock = require( 'fetch-mock' ), fsp = require( 'fs-promise' ), unzip = require( 'unzip' ), rimraf = require( 'rimraf-then' ), path = require( 'path' ); let zipLink = 'https://github.com/stevemao/left-pad/archive/master.zip', out = 'left-pad-master'; // Careful: lib might be removed at any moment. var resp = new Response( fsp.createReadStream( path.join( __dirname, 'left-pad-master.zip' ) ), { headers: { "Content-Type" : "application/zip" } } ); fetchMock.get(zipLink, resp); rimraf( out ) .then( () => fetch( zipLink ) ) .then( response => { return new Promise( ( resolve, reject ) => { // For example purpose, just parse zip file, and log each entry. response.body.pipe( unzip.Parse() ) .on( 'entry', ( entry ) => console.log( entry.path ) ) .on( 'close', resolve ) .on( 'error', reject ); } ); } ) .then( () => console.log( 'done' ) ) .catch( console.log ); 
+4
source

Source: https://habr.com/ru/post/1263148/


All Articles