From be58adb1b9f64126e4407a6610a751eab139f55d Mon Sep 17 00:00:00 2001 From: Mario de Frutos Date: Fri, 28 Apr 2017 14:46:36 +0200 Subject: [PATCH] Be able to override buffer-size configuration without placeholders in named maps --- .../adapter/mapconfig-named-layers-adapter.js | 1 - .../adapter/mapconfig-named-map-adapter.js | 35 ++++ .../mapconfig/provider/named-map-provider.js | 1 + lib/cartodb/server.js | 2 + test/acceptance/buffer-size-format.js | 182 +++++++++++++++++- .../tile-7.64.48-buffer-size-128.geojson | 1 + .../tile-7.64.48-buffer-size-128.grid.json | 1 + ...-grid.json.7.64.48-buffer-size-0.grid.json | 1 + .../tile-mvt-7.64.48-buffer-size-0.geojson | 1 + .../tile-mvt-7.64.48-buffer-size-0.mvt | Bin 0 -> 615 bytes .../tile-mvt-7.64.48-buffer-size-128.mvt | Bin 0 -> 1877 bytes test/support/test-client.js | 15 +- 12 files changed, 234 insertions(+), 6 deletions(-) create mode 100644 lib/cartodb/models/mapconfig/adapter/mapconfig-named-map-adapter.js create mode 100644 test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.geojson create mode 100644 test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.grid.json create mode 100644 test/fixtures/buffer-size/tile-grid.json.7.64.48-buffer-size-0.grid.json create mode 100644 test/fixtures/buffer-size/tile-mvt-7.64.48-buffer-size-0.geojson create mode 100644 test/fixtures/buffer-size/tile-mvt-7.64.48-buffer-size-0.mvt create mode 100644 test/fixtures/buffer-size/tile-mvt-7.64.48-buffer-size-128.mvt diff --git a/lib/cartodb/models/mapconfig/adapter/mapconfig-named-layers-adapter.js b/lib/cartodb/models/mapconfig/adapter/mapconfig-named-layers-adapter.js index fd00e344..17c2059f 100644 --- a/lib/cartodb/models/mapconfig/adapter/mapconfig-named-layers-adapter.js +++ b/lib/cartodb/models/mapconfig/adapter/mapconfig-named-layers-adapter.js @@ -43,7 +43,6 @@ MapConfigNamedLayersAdapter.prototype.getMapConfig = function (user, requestMapC if (nestedNamedLayers.length > 0) { var nestedNamedMapsError = new Error('Nested named layers are not allowed'); - // nestedNamedMapsError.http_status = 400; return done(nestedNamedMapsError); } diff --git a/lib/cartodb/models/mapconfig/adapter/mapconfig-named-map-adapter.js b/lib/cartodb/models/mapconfig/adapter/mapconfig-named-map-adapter.js new file mode 100644 index 00000000..76e8f3f5 --- /dev/null +++ b/lib/cartodb/models/mapconfig/adapter/mapconfig-named-map-adapter.js @@ -0,0 +1,35 @@ +var _ = require('underscore'); + +function MapConfigNamedMapAdapter() { +} + +module.exports = MapConfigNamedMapAdapter; + +MapConfigNamedMapAdapter.prototype.getMapConfig = function (user, requestMapConfig, params, context, callback) { + if (context.templateParams && + context.templateParams.buffersize && + isValidBufferSize(context.templateParams.buffersize)) { + requestMapConfig.buffersize = context.templateParams.buffersize; + } + + process.nextTick(function () { + callback(null, requestMapConfig); + }); +}; + +function isValidBufferSize (bufferSize) { + var formats = ['png', 'png32', 'mvt', 'grid.json', 'geojson']; + + if (!_.isObject(bufferSize) || (_.isArray(bufferSize) || _.isFunction(bufferSize))) { + return false; + } + + for (var index = 0; index < formats.length; index++) { + var bufferSizeByFormat = bufferSize[formats[index]]; + if (bufferSizeByFormat && !Number.isFinite(bufferSizeByFormat)) { + return false; + } + } + + return true; +} diff --git a/lib/cartodb/models/mapconfig/provider/named-map-provider.js b/lib/cartodb/models/mapconfig/provider/named-map-provider.js index 2439a650..594ec247 100644 --- a/lib/cartodb/models/mapconfig/provider/named-map-provider.js +++ b/lib/cartodb/models/mapconfig/provider/named-map-provider.js @@ -90,6 +90,7 @@ NamedMapMapConfigProvider.prototype.getMapConfig = function(callback) { }, function instantiateTemplate(err, templateParams) { assert.ifError(err); + context.templateParams = templateParams; return self.templateMaps.instance(self.template, templateParams); }, function prepareAdapterMapConfig(err, requestMapConfig) { diff --git a/lib/cartodb/server.js b/lib/cartodb/server.js index b695a367..22b14f5b 100644 --- a/lib/cartodb/server.js +++ b/lib/cartodb/server.js @@ -35,6 +35,7 @@ var timeoutErrorTile = require('fs').readFileSync(timeoutErrorTilePath, {encodin var SqlWrapMapConfigAdapter = require('./models/mapconfig/adapter/sql-wrap-mapconfig-adapter'); var MapConfigNamedLayersAdapter = require('./models/mapconfig/adapter/mapconfig-named-layers-adapter'); +var MapConfigNamedMapAdapter = require('./models/mapconfig/adapter/mapconfig-named-map-adapter'); var AnalysisMapConfigAdapter = require('./models/mapconfig/adapter/analysis-mapconfig-adapter'); var MapConfigOverviewsAdapter = require('./models/mapconfig/adapter/mapconfig-overviews-adapter'); var TurboCartoAdapter = require('./models/mapconfig/adapter/turbo-carto-adapter'); @@ -155,6 +156,7 @@ module.exports = function(serverOptions) { var mapConfigAdapter = new MapConfigAdapter( new MapConfigNamedLayersAdapter(templateMaps, pgConnection), + new MapConfigNamedMapAdapter(), new SqlWrapMapConfigAdapter(), new DataviewsWidgetsAdapter(), new AnalysisMapConfigAdapter(analysisBackend), diff --git a/test/acceptance/buffer-size-format.js b/test/acceptance/buffer-size-format.js index 50a11329..8c8f6f7b 100644 --- a/test/acceptance/buffer-size-format.js +++ b/test/acceptance/buffer-size-format.js @@ -1,7 +1,9 @@ require('../support/test_helper'); +var fs = require('fs'); var assert = require('../support/assert'); var TestClient = require('../support/test-client'); +var mapnik = require('windshaft').mapnik; var IMAGE_TOLERANCE_PER_MIL = 5; var CARTOCSS_LABELS = [ @@ -76,7 +78,7 @@ describe('buffer size per format', function () { desc: 'should get mvt tile using buffer-size 0', coords: { z: 7, x: 64, y: 48 }, format: 'mvt', - fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-0.png', + fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-0.mvt', mapConfig: createMapConfig({ mvt: 0 }), assert: function (tile, callback) { var tileJSON = tile.toJSON(); @@ -89,7 +91,7 @@ describe('buffer size per format', function () { desc: 'should get mvt tile using buffer-size 128', coords: { z: 7, x: 64, y: 48 }, format: 'mvt', - fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.png', + fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.mvt', mapConfig: createMapConfig({ mvt: 128 }), assert: function (tile, callback) { var tileJSON = tile.toJSON(); @@ -140,7 +142,7 @@ describe('buffer size per format for named maps', function () { coords: { z: 7, x: 64, y: 48 }, format: 'png', fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-0.png', - template: createBufferSizeTemplate('named-default-buffer-size', '<%= buffersize %>'), + template: createBufferSizeTemplate('named-default-buffer-size', {png: '<%= buffersize %>'}), assert: function (tile, callback) { assert.imageIsSimilarToFile(tile, this.fixturePath, IMAGE_TOLERANCE_PER_MIL, callback); } @@ -151,7 +153,7 @@ describe('buffer size per format for named maps', function () { format: 'png', placeholders: { buffersize: 128 }, fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.png', - template: createBufferSizeTemplate('named-custom-buffer-size', '<%= buffersize %>'), + template: createBufferSizeTemplate('named-custom-buffer-size', { png: '<%= buffersize %>'}), assert: function (tile, callback) { assert.imageIsSimilarToFile(tile, this.fixturePath, IMAGE_TOLERANCE_PER_MIL, callback); } @@ -214,3 +216,175 @@ describe('buffer size per format for named maps', function () { }); }); }); + + +describe('buffer size per format for named maps w/o placeholders', function () { + var testCases = [ + { + desc: 'should get png tile using buffer-size 0 overriden by template params', + coords: { z: 7, x: 64, y: 48 }, + format: 'png', + placeholders: { + buffersize: { + png: 0 + } + }, + fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-0.png', + template: createBufferSizeTemplate('named-no-buffer-size-png-0', {}, {}), + assert: function (tile, callback) { + assert.imageIsSimilarToFile(tile, this.fixturePath, IMAGE_TOLERANCE_PER_MIL, callback); + } + }, + { + desc: 'should get png tile using buffer-size 128 overriden by template params', + coords: { z: 7, x: 64, y: 48 }, + format: 'png', + placeholders: { + buffersize: { + png: 128 + } + }, + fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.png', + template: createBufferSizeTemplate('named-no-buffer-size-png-128', {}, {}), + assert: function (tile, callback) { + assert.imageIsSimilarToFile(tile, this.fixturePath, IMAGE_TOLERANCE_PER_MIL, callback); + } + }, + { + desc: 'should get mvt tile using buffer-size 0 overriden by template params', + coords: { z: 7, x: 64, y: 48 }, + format: 'mvt', + placeholders: { + buffersize: { + mvt: 0 + } + }, + fixturePath: './test/fixtures/buffer-size/tile-mvt-7.64.48-buffer-size-0.mvt', + template: createBufferSizeTemplate('named-no-buffer-size-mvt', {}, {}), + assert: function (tile, callback) { + var tileJSON = tile.toJSON(); + var features = tileJSON[0].features; + + var dataFixture = fs.readFileSync(this.fixturePath); + var vtile = new mapnik.VectorTile(this.coords.z, this.coords.x, this.coords.y); + vtile.setDataSync(dataFixture); + var vtileJSON = vtile.toJSON(); + var vtileFeatures = vtileJSON[0].features; + + assert.equal(features.length, vtileFeatures.length); + callback(); + } + }, + { + desc: 'should get mvt tile using buffer-size 128 overriden by template params', + coords: { z: 7, x: 64, y: 48 }, + format: 'mvt', + placeholders: { + buffersize: { + mvt: 128 + } + }, + fixturePath: './test/fixtures/buffer-size/tile-mvt-7.64.48-buffer-size-128.mvt', + template: createBufferSizeTemplate('named-no-buffer-size-mvt-128', {}, {}), + assert: function (tile, callback) { + var tileJSON = tile.toJSON(); + var features = tileJSON[0].features; + + var dataFixture = fs.readFileSync(this.fixturePath); + var vtile = new mapnik.VectorTile(this.coords.z, this.coords.x, this.coords.y); + vtile.setDataSync(dataFixture); + var vtileJSON = vtile.toJSON(); + var vtileFeatures = vtileJSON[0].features; + + assert.equal(features.length, vtileFeatures.length); + callback(); + } + }, + { + desc: 'should get geojson tile using buffer-size 0 overriden by template params', + coords: { z: 7, x: 64, y: 48 }, + format: 'geojson', + placeholders: { + buffersize: { + geojson: 0 + } + }, + fixturePath: './test/fixtures/buffer-size/tile-mvt-7.64.48-buffer-size-0.geojson', + template: createBufferSizeTemplate('named-no-buffer-size-geojson-0', {}, {}), + assert: function (tile, callback) { + var dataFixture = JSON.parse(fs.readFileSync(this.fixturePath)); + assert.equal(tile.features.length, dataFixture.features.length); + callback(); + } + }, + { + desc: 'should get geojson tile using buffer-size 128 overriden by template params', + coords: { z: 7, x: 64, y: 48 }, + format: 'geojson', + placeholders: { + buffersize: { + geojson: 128 + } + }, + fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.geojson', + template: createBufferSizeTemplate('named-no-buffer-size-geojson-128', {}, {}), + assert: function (tile, callback) { + var dataFixture = JSON.parse(fs.readFileSync(this.fixturePath)); + assert.equal(tile.features.length, dataFixture.features.length); + callback(); + } + }, + { + desc: 'should get grid.json tile using buffer-size 0 overriden by template params', + coords: { z: 7, x: 64, y: 48 }, + format: 'grid.json', + placeholders: { + buffersize: { + 'grid.json': 0 + } + }, + fixturePath: './test/fixtures/buffer-size/tile-grid.json.7.64.48-buffer-size-0.grid.json', + template: createBufferSizeTemplate('named-no-buffer-size-grid-json-0', {}, {}), + assert: function (tile, callback) { + assert.utfgridEqualsFile(tile, this.fixturePath, 2,callback); + } + }, + { + desc: 'should get grid.json tile using buffer-size 128 overriden by template params', + coords: { z: 7, x: 64, y: 48 }, + format: 'grid.json', + placeholders: { + buffersize: { + 'grid.json': 128 + } + }, + fixturePath: './test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.grid.json', + template: createBufferSizeTemplate('named-no-buffer-size-grid-json-128', {}, {}), + assert: function (tile, callback) { + assert.utfgridEqualsFile(tile, this.fixturePath, 2, callback); + } + }, + ]; + + testCases.forEach(function (test) { + it(test.desc, function (done) { + var testClient = new TestClient(test.template, 1234); + var coords = test.coords; + var options = { + format: test.format, + placeholders: test.placeholders + }; + testClient.getTile(coords.z, coords.x, coords.y, options, function (err, res, tile) { + assert.ifError(err); + // To generate images use: + //tile.save(test.fixturePath); + // require('fs').writeFileSync(test.fixturePath, JSON.stringify(tile)); + // require('fs').writeFileSync(test.fixturePath, tile.getDataSync()); + test.assert(tile, function (err) { + assert.ifError(err); + testClient.drain(done); + }); + }); + }); + }); +}); diff --git a/test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.geojson b/test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.geojson new file mode 100644 index 00000000..e89c71dd --- /dev/null +++ b/test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.geojson @@ -0,0 +1 @@ +{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[-53839,4629161]},"properties":{"name":"Alicante","cartodb_id":1200}},{"type":"Feature","geometry":{"type":"Point","coordinates":[242835,5069332]},"properties":{"name":"Barcelona","cartodb_id":5330}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-5567,4861644]},"properties":{"name":"Castello","cartodb_id":1201}},{"type":"Feature","geometry":{"type":"Point","coordinates":[272735,5092314]},"properties":{"name":"Mataro","cartodb_id":615}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-125787,4576600]},"properties":{"name":"Murcia","cartodb_id":952}},{"type":"Feature","geometry":{"type":"Point","coordinates":[295469,4804267]},"properties":{"name":"Palma","cartodb_id":5500}},{"type":"Feature","geometry":{"type":"Point","coordinates":[139148,5030112]},"properties":{"name":"Tarragona","cartodb_id":616}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-44746,4791667]},"properties":{"name":"Valencia","cartodb_id":5942}},{"type":"Feature","geometry":{"type":"Point","coordinates":[-99072,5108695]},"properties":{"name":"Zaragoza","cartodb_id":5932}}]} \ No newline at end of file diff --git a/test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.grid.json b/test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.grid.json new file mode 100644 index 00000000..c06b8d91 --- /dev/null +++ b/test/fixtures/buffer-size/tile-7.64.48-buffer-size-128.grid.json @@ -0,0 +1 @@ +{"grid":[" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," !! ","!!! !!!!! ","!!!!!!! ! ","!!! !!!!! "," !! ! "," "," "," "," "," "," "," "," ### # "," ####### ###"," ####### ## ","$ ## #### ## ","$$ ","$$ ","$$ "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],"keys":["","9","2","1"],"data":{"1":{"cartodb_id":5942},"2":{"cartodb_id":5500},"9":{"cartodb_id":1201}}} \ No newline at end of file diff --git a/test/fixtures/buffer-size/tile-grid.json.7.64.48-buffer-size-0.grid.json b/test/fixtures/buffer-size/tile-grid.json.7.64.48-buffer-size-0.grid.json new file mode 100644 index 00000000..24581bc3 --- /dev/null +++ b/test/fixtures/buffer-size/tile-grid.json.7.64.48-buffer-size-0.grid.json @@ -0,0 +1 @@ +{"grid":[" "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," !!! ! "," !!!!!!! !!!"," !!!!!!! !! "," !! !!!! !! "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "," "],"keys":["","1"],"data":{"1":{"cartodb_id":5500}}} \ No newline at end of file diff --git a/test/fixtures/buffer-size/tile-mvt-7.64.48-buffer-size-0.geojson b/test/fixtures/buffer-size/tile-mvt-7.64.48-buffer-size-0.geojson new file mode 100644 index 00000000..500fb3ea --- /dev/null +++ b/test/fixtures/buffer-size/tile-mvt-7.64.48-buffer-size-0.geojson @@ -0,0 +1 @@ +{"type":"FeatureCollection","features":[{"type":"Feature","geometry":{"type":"Point","coordinates":[295469,4804267]},"properties":{"name":"Palma","cartodb_id":5500}}]} \ No newline at end of file diff --git a/test/fixtures/buffer-size/tile-mvt-7.64.48-buffer-size-0.mvt b/test/fixtures/buffer-size/tile-mvt-7.64.48-buffer-size-0.mvt new file mode 100644 index 0000000000000000000000000000000000000000..b87f1b9a6d5d6a4922b1d822d2f71e5e0fcebe85 GIT binary patch literal 615 zcmXw0%We}f6wPGbZkxxX3C#s6%iRDHsD&j63WWt!h)Vr{=yt|Qta|Kd#)W3r?veNb z{(%iYz>)=@zz%)^HY~6w?JPz<=iGabk1zZR&f6rCxa8IDoeK&v7Uk{)AF+`5ua1va zIL8GGhb{X-;&g>2XE6zn7bsLi?KM=7bY9mIYx)8u$BNew*;bSWNRE}!#mPhz%%}hE zL7dM~&3Mtwy?Ev@&rj{xHf=##i0KsTTnI?qQE9{3kPHr1J+#j4d|IJ8eE?+2(VSI0 zm&p30`@ATHy1z%QuP`VfopJ5%W_`n%Rtm8Qg=+D2SD=3tO-#+yq zb*eUVURmPuqa~Wot7H)*wSK=^Tt<3_Ld^jTbX-tx}be(Lhb=JEZy-vTIMT72UZ`d70H~L%IcmSI> Lhqp$zTif1$xTB}x literal 0 HcmV?d00001 diff --git a/test/fixtures/buffer-size/tile-mvt-7.64.48-buffer-size-128.mvt b/test/fixtures/buffer-size/tile-mvt-7.64.48-buffer-size-128.mvt new file mode 100644 index 0000000000000000000000000000000000000000..c6e5421217b66b22d078be2ea92910bfda79b91e GIT binary patch literal 1877 zcmYk6Yitx%7>2u-*}1e#x4YAJ=M>5~pil&4TLpzew_PrBlR^;zFYRGwx}7jPvzeV0 zN{j*dp%DoZLuye%3=%Y&0Nx;x*eYtGsDTnCf)e~;M1z`uR2m`powM5s`{Ubl&YV5- zyzl#+MML7|pb)Weui?&^yj4Lg*0VD@ag)jjp#>f7#kq!aDpOqsAH-DIZNotk#3=jG>c( zp>2dygGw3Vb+fx0=QYzrLbrjvf@^3NR;z@{Ry}Ll(~=6DXL{H|e8zCdo8dgBnroDo zpop1wI&q^K7J@*}TX=(Ex!B$a2Zs=6VbAmmx}oy&vu93^ss1FLf<2C%8C^YeXxI2} z`hOgNt@+L@_Ou@OVF0l(qYBFfepFW@;<82tYo^y*9MKJez>RJ|VX}gFQj2OhG9=;< zjJ&)C4#Dv@VslOo-nLl{D}!$(OHG4;Rh$l}Sug7pS!&gf27ak`aaG7)$RSt5Ru<61f)jV(?DREFQp4^HI*vF5U}Kp+?lg~9E$1ruF@jiLSrHvmRS^^8q9j%`HI=o|M3o#vd|iBO*|>lj6~x7P3+I(K(1Bee z51HPaLK|gk3*v}Q+wlywT8O8MF)I{YA>`9xpNHiokc8d)ZEo9F=@blKpKy4^uXC6b zX|8r`Wieu@dzPohg(|wD%r}(f*s>f~!(d)Lc=GeVHBdj@6@|L(r6{aMVoRyc51NM? zxL|BvNv8xlt0Of;XMHUwO;Dw>h(Kvw6%(%;KUS&(rQ>Sr6XRtC-BnTwsi!gYTjAtU z3?hdbiXv0+b!m7W(Qv;0%Js^l^N9wr>5U67ZVIH-3PEVYu4X`g;iL*@_%k@;-Jr@S zg9qU&ti1Ml7u3EFN2!OB`zyGRPpty=gvdmn`ff^nk2ndaCqq6B@dl{@sHfE4o0uw3 zLlu;|hB&s$$e1VJw-p^cE4XkO;myZcz*c&w_4|GwF>|-t2=S`|D*1>f!IJO5JloKCzYy``t4g`0l&I)ftp8DK-LM6S&$WHBnFRPdp&c^gRtJ zzlF(_Zg+A8xR!>ljSTH4n&ylmVT)Y1btW*6S<52Yv@1mQZ6u>efB`pTg` zzmtX9zoQ0Lx!59_{H0kVQI3htE+tPqoK@=Z2Ze_y;cRgZ5H1w*6wZzi;o`)RZ*Ndj|Y{z{{W8PP*s2LDES- oe8!hRb_e#>bG#2if_l;id5VH`id_JL0R&5!f^0}=vOWs(KV!GHW&i*H literal 0 HcmV?d00001 diff --git a/test/support/test-client.js b/test/support/test-client.js index b2a326b8..bbb32c9d 100644 --- a/test/support/test-client.js +++ b/test/support/test-client.js @@ -545,6 +545,20 @@ TestClient.prototype.getTile = function(z, x, y, params, callback) { expectedResponse.headers['Content-Type'] = 'application/x-protobuf'; } + var isGeojson = format.match(/geojson$/); + + if (isGeojson) { + request.encoding = 'utf-8'; + expectedResponse.headers['Content-Type'] = 'application/json; charset=utf-8'; + } + + var isGridJSON = format.match(/grid.json$/); + + if (isGridJSON) { + request.encoding = 'utf-8'; + expectedResponse.headers['Content-Type'] = 'application/json; charset=utf-8'; + } + assert.response(server, request, expectedResponse, function(res, err) { assert.ifError(err); @@ -557,7 +571,6 @@ TestClient.prototype.getTile = function(z, x, y, params, callback) { obj = new mapnik.VectorTile(z, x, y); obj.setDataSync(new Buffer(res.body, 'binary')); } - else { obj = JSON.parse(res.body); }