使用fetch-mock模拟zip压缩响应

我试着用下面的代码:

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 ); 

但它抛出:

 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) 

如果您将fetchMock.get调用注释掉,并且使用真正的fetch则可以很好地工作。

代码位于https://github.com/mlewand/unzip-mock-example

Response实例作为第二个parameter passing给fetchMock.get() ,其中响应对象的主体是本地文件stream:

 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 );