Skip to content

Commit

Permalink
fix: fetch 清理不存在 key 的逻辑考虑指定 keys fetch 的情况
Browse files Browse the repository at this point in the history
  • Loading branch information
leeyeh committed Dec 2, 2019
1 parent e9a37b4 commit 2d30171
Show file tree
Hide file tree
Showing 3 changed files with 164 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
},
"entries": [
{
"_id": "a54a79dc2b720a740328a56c3d840384",
"_id": "453957608e886366ee9fa38eee427008",
"_order": 0,
"cache": {},
"request": {
Expand All @@ -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",
Expand All @@ -33,7 +33,7 @@
},
{
"name": "x-lc-sign",
"value": "e925d8f948e7f6b410f1910ca95546b4,1568868355888"
"value": "27fe3f232e7227707dfffe746c6fbd6d,1575268748053"
},
{
"name": "x-lc-hook-key",
Expand All @@ -49,26 +49,31 @@
},
{
"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": {
"mimeType": "application/json;charset=UTF-8",
"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": [
Expand All @@ -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",
Expand All @@ -105,30 +110,146 @@
"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,
"dns": -1,
"receive": 0,
"send": 0,
"ssl": -1,
"wait": 167
"wait": 110
}
}
],
Expand Down
13 changes: 10 additions & 3 deletions src/object.js
Original file line number Diff line number Diff line change
Expand Up @@ -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];
});
},
Expand Down
23 changes: 16 additions & 7 deletions test/object.js
Original file line number Diff line number Diff line change
Expand Up @@ -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([
Expand Down

0 comments on commit 2d30171

Please sign in to comment.