From 2d30171779a2a809377674c95f1e1d13caaa9706 Mon Sep 17 00:00:00 2001 From: Lee Yeh Date: Mon, 2 Dec 2019 15:14:40 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20fetch=20=E6=B8=85=E7=90=86=E4=B8=8D?= =?UTF-8?q?=E5=AD=98=E5=9C=A8=20key=20=E7=9A=84=E9=80=BB=E8=BE=91=E8=80=83?= =?UTF-8?q?=E8=99=91=E6=8C=87=E5=AE=9A=20keys=20fetch=20=E7=9A=84=E6=83=85?= =?UTF-8?q?=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../recording.har | 155 ++++++++++++++++-- src/object.js | 13 +- test/object.js | 23 ++- 3 files changed, 164 insertions(+), 27 deletions(-) diff --git a/recordings/Objects_136869387/Fetching-Objects_1241673741/fetch-should-remove-deleted-keys_1235015609/recording.har b/recordings/Objects_136869387/Fetching-Objects_1241673741/fetch-should-remove-deleted-keys_1235015609/recording.har index 726bcc840..b18d07ac3 100644 --- a/recordings/Objects_136869387/Fetching-Objects_1241673741/fetch-should-remove-deleted-keys_1235015609/recording.har +++ b/recordings/Objects_136869387/Fetching-Objects_1241673741/fetch-should-remove-deleted-keys_1235015609/recording.har @@ -8,7 +8,7 @@ }, "entries": [ { - "_id": "a54a79dc2b720a740328a56c3d840384", + "_id": "453957608e886366ee9fa38eee427008", "_order": 0, "cache": {}, "request": { @@ -21,7 +21,7 @@ }, { "name": "user-agent", - "value": "LeanCloud-JS-SDK/3.15.0 (Node.js; Node.js/v12.10.0)" + "value": "LeanCloud-JS-SDK/4.0.0 (Node.js; Node.js/v12.12.0)" }, { "name": "x-lc-id", @@ -33,7 +33,7 @@ }, { "name": "x-lc-sign", - "value": "e925d8f948e7f6b410f1910ca95546b4,1568868355888" + "value": "27fe3f232e7227707dfffe746c6fbd6d,1575268748053" }, { "name": "x-lc-hook-key", @@ -49,10 +49,10 @@ }, { "name": "host", - "value": "95tnuaos.api.lncldapi.com" + "value": "95tnuaos.lc-cn-e1-shared.com" } ], - "headersSize": 450, + "headersSize": 476, "httpVersion": "HTTP/1.1", "method": "GET", "postData": { @@ -60,15 +60,20 @@ "params": [], "text": "null" }, - "queryString": [], - "url": "https://95tnuaos.api.lncldapi.com/1.1/classes/GameScore/5d8308029c9235000886c4cf" + "queryString": [ + { + "name": "keys", + "value": "fakedDeletedKey" + } + ], + "url": "https://95tnuaos.lc-cn-e1-shared.com/1.1/classes/GameScore/5d8308029c9235000886c4cf?keys=fakedDeletedKey" }, "response": { - "bodySize": 330, + "bodySize": 48, "content": { "mimeType": "application/json;charset=utf-8", - "size": 330, - "text": "[\"1f8b08000000000000037d8d310ec2300c45efe2b9ad9c3429493646069898400c214e455151aa340c0871771cb133d97efa7eff0dcf857c89b42de040a2b02dda56d8232aa7b4d3ba1b8c3e41033e6770e73ac4ef927069205def31941df1af26d3a341698395bd46446386a0c2c8e990e39f0ad5e166a815cbec5f311ffc23728e88c954c553ddd6903263c15e64e18d85fb444c463faff1f3055ae47c6ac7000000\"]" + "size": 48, + "text": "[\"1f8b0800000000000003abae050043bfa6a302000000\"]" }, "cookies": [], "headers": [ @@ -78,7 +83,7 @@ }, { "name": "date", - "value": "Thu, 19 Sep 2019 04:45:56 GMT" + "value": "Mon, 02 Dec 2019 06:39:08 GMT" }, { "name": "content-type", @@ -105,22 +110,138 @@ "value": "no-cache" }, { - "name": "last-modified", - "value": "Thu, 19 Sep 2019 04:45:55.685 GMT" + "name": "content-encoding", + "value": "gzip" + } + ], + "headersSize": 250, + "httpVersion": "HTTP/1.1", + "redirectURL": "", + "status": 200, + "statusText": "OK" + }, + "startedDateTime": "2019-12-02T06:39:08.057Z", + "time": 609, + "timings": { + "blocked": -1, + "connect": -1, + "dns": -1, + "receive": 0, + "send": 0, + "ssl": -1, + "wait": 609 + } + }, + { + "_id": "a54a79dc2b720a740328a56c3d840384", + "_order": 0, + "cache": {}, + "request": { + "bodySize": 4, + "cookies": [], + "headers": [ + { + "name": "accept-encoding", + "value": "gzip, deflate" + }, + { + "name": "user-agent", + "value": "LeanCloud-JS-SDK/4.0.0 (Node.js; Node.js/v12.12.0)" + }, + { + "name": "x-lc-id", + "value": "95TNUaOSUd8IpKNW0RSqSEOm-9Nh9j0Va" + }, + { + "name": "content-type", + "value": "application/json;charset=UTF-8" + }, + { + "name": "x-lc-sign", + "value": "10de8dad95beec10f84d9e1c3b700bd5,1575269685664" + }, + { + "name": "x-lc-hook-key", + "value": "2iCbUZDgEF0siKxmCn2kVQXV" + }, + { + "name": "x-lc-prod", + "value": "1" + }, + { + "name": "content-length", + "value": 4 + }, + { + "name": "host", + "value": "95tnuaos.lc-cn-e1-shared.com" + } + ], + "headersSize": 455, + "httpVersion": "HTTP/1.1", + "method": "GET", + "postData": { + "mimeType": "application/json;charset=UTF-8", + "params": [], + "text": "null" + }, + "queryString": [], + "url": "https://95tnuaos.lc-cn-e1-shared.com/1.1/classes/GameScore/5d8308029c9235000886c4cf" + }, + "response": { + "bodySize": 48, + "content": { + "mimeType": "application/json;charset=utf-8", + "size": 48, + "text": "[\"1f8b0800000000000003abae050043bfa6a302000000\"]" + }, + "cookies": [], + "headers": [ + { + "name": "server", + "value": "openresty" + }, + { + "name": "date", + "value": "Mon, 02 Dec 2019 06:54:45 GMT" + }, + { + "name": "content-type", + "value": "application/json;charset=utf-8" + }, + { + "name": "transfer-encoding", + "value": "chunked" + }, + { + "name": "connection", + "value": "close" + }, + { + "name": "vary", + "value": "Accept-Encoding" + }, + { + "name": "cache-control", + "value": "no-cache,no-store" + }, + { + "name": "pragma", + "value": "no-cache" }, { "name": "content-encoding", "value": "gzip" } ], - "headersSize": 300, + "headersSize": 250, "httpVersion": "HTTP/1.1", "redirectURL": "", "status": 200, "statusText": "OK" }, - "startedDateTime": "2019-09-19T04:45:55.890Z", - "time": 167, + "startedDateTime": "2019-12-02T06:54:45.734Z", + "time": 110, "timings": { "blocked": -1, "connect": -1, @@ -128,7 +249,7 @@ "receive": 0, "send": 0, "ssl": -1, - "wait": 167 + "wait": 110 } } ], diff --git a/src/object.js b/src/object.js index 342bd690d..2a27181a5 100644 --- a/src/object.js +++ b/src/object.js @@ -947,14 +947,21 @@ module.exports = function(AV) { ); return request.then(function(response) { const fetchedAttrs = self.parse(response); - if (!fetchOptions.keys) self._cleanupUnsetKeys(fetchedAttrs); + self._cleanupUnsetKeys( + fetchedAttrs, + fetchOptions.keys + ? ensureArray(fetchOptions.keys) + .join(',') + .split(',') + : undefined + ); self._finishFetch(fetchedAttrs, true); return self; }); }, - _cleanupUnsetKeys(fetchedAttrs) { - AV._objectEach(this._serverData, (value, key) => { + _cleanupUnsetKeys(fetchedAttrs, fetchedKeys = _.keys(this._serverData)) { + _.forEach(fetchedKeys, key => { if (fetchedAttrs[key] === undefined) delete this._serverData[key]; }); }, diff --git a/test/object.js b/test/object.js index 9bd50759b..876371f63 100644 --- a/test/object.js +++ b/test/object.js @@ -448,14 +448,23 @@ describe('Objects', function() { expect(score.id).to.be.eql(gameScore.id); })); it('fetch should remove deleted keys', () => { - const score = AV.parseJSON( - Object.assign(gameScore.toFullJSON(), { - fakedDeletedKey: 'value', + const getFakedScore = () => + AV.parseJSON( + Object.assign(gameScore.toFullJSON(), { + fakedDeletedKey: 'value', + }) + ); + return getFakedScore() + .fetch() + .then(fetchedScore => { + expect(fetchedScore.get('fakedDeletedKey')).to.eql(undefined); + return getFakedScore().fetch({ + keys: 'fakedDeletedKey', + }); }) - ); - return score.fetch().then(() => { - expect(score.get('fakedDeletedKey')).to.eql(undefined); - }); + .then(fetchedScore => { + expect(fetchedScore.get('fakedDeletedKey')).to.eql(undefined); + }); }); it('fetchAll', () => AV.Object.fetchAll([