Skip to content

Commit f2f91dc

Browse files
committed
Merge pull request #214 from jysperm/rpc-function
添加 AV.Cloud.rpc 方法
2 parents ba3f5b3 + 6fa9be3 commit f2f91dc

File tree

4 files changed

+150
-1
lines changed

4 files changed

+150
-1
lines changed

lib/cloudfunction.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,25 @@ module.exports = function(AV) {
3434
})._thenRunCallbacks(options);
3535
},
3636

37+
/**
38+
* Makes a call to a cloud function, you can send {AV.Object} as param or a field of param; the response
39+
* from server will also be parsed as an {AV.Object}, array of {AV.Object}, or object includes {AV.Object}
40+
* @param {String} name The function name.
41+
* @param {Object} data The parameters to send to the cloud function.
42+
* @param {Object} options A Backbone-style options object.
43+
* @return {AV.Promise} A promise that will be resolved with the result of the function.
44+
*/
45+
rpc: function(name, data, options) {
46+
if (_.isArray(data)) {
47+
return AV.Promise.error(new Error('Can\'t pass Array as the param of rpc function in JavaScript SDK.'))
48+
._thenRunCallbacks(options);
49+
}
50+
51+
return AV._request('call', name, null, 'POST', AV._encodeObjectOrArray(data)).then(function(resp) {
52+
return AV._decode('', resp).result;
53+
})._thenRunCallbacks(options);
54+
},
55+
3756
/**
3857
* Make a call to request server date time.
3958
* @param {Object} options A Backbone-style options object

lib/utils.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,7 @@ module.exports = function(AV) {
277277
route !== "files" &&
278278
route !== "date" &&
279279
route !== "functions" &&
280+
route !== "call" &&
280281
route !== "login" &&
281282
route !== "push" &&
282283
route !== "search/select" &&
@@ -527,6 +528,26 @@ module.exports = function(AV) {
527528
return value;
528529
};
529530

531+
AV._encodeObjectOrArray = function(value) {
532+
var encodeAVObject = function(object) {
533+
if (object && object._toFullJSON){
534+
object = object._toFullJSON([]);
535+
}
536+
537+
return _.mapObject(object, function(value) {
538+
return AV._encode(value, []);
539+
});
540+
};
541+
542+
if (_.isArray(value)) {
543+
return value.map(function(object) {
544+
return encodeAVObject(object);
545+
});
546+
} else {
547+
return encodeAVObject(value);
548+
}
549+
};
550+
530551
AV._arrayEach = AV._.each;
531552

532553
/**

test/cloud.js

Lines changed: 109 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,21 @@
11
describe("AV.Cloud", function() {
2+
var originalServerURL, originalAppId, originalAppKey, originalUseMasterKey;
3+
4+
before(function() {
5+
originalServerURL = AV.serverURL;
6+
originalAppId = AV.applicationId;
7+
originalAppKey = AV.applicationKey;
8+
originalUseMasterKey = AV._useMasterKey;
9+
10+
AV.serverURL = 'https://leancloud.cn'
11+
AV.applicationId = '4h2h4okwiyn8b6cle0oig00vitayum8ephrlsvg7xo8o19ne';
12+
AV.applicationKey = '3xjj1qw91cr3ygjq9lt0g8c3qpet38rrxtwmmp0yffyoy2t4';
13+
AV._useMasterKey = false;
14+
15+
AV.User._currentUser = null;
16+
});
17+
218
describe("#getServerDate", function(){
3-
419
it("should return a date.", function(done){
520
AV.Cloud.getServerDate().then(function(date) {
621
expect(date).to.be.a('object');
@@ -11,4 +26,97 @@ describe("AV.Cloud", function() {
1126
});
1227
});
1328
});
29+
30+
describe('#rpc', function() {
31+
it('receive complex object', function() {
32+
return AV.Cloud.rpc('complexObject').then(function(result) {
33+
expect(result.foo).to.be('bar');
34+
expect(result.t).to.be.a(Date);
35+
expect(result.t.toISOString()).to.be('2015-05-14T09:21:18.273Z');
36+
37+
expect(result.avObject).to.be.a(AV.Object);
38+
expect(result.avObject.className).to.be('ComplexObject');
39+
expect(result.avObject.get('numberColumn')).to.be(1.23);
40+
expect(result.avObject.get('arrayColumn')).to.eql([1, 2, 3]);
41+
expect(result.avObject.get('objectColumn')).to.eql({foo: 'bar'});
42+
expect(result.avObject.get('stringColumn')).to.be('testString');
43+
expect(result.avObject.get('anyColumn')).to.be('');
44+
expect(result.avObject.get('booleanColumn')).to.be(true);
45+
expect(result.avObject.get('pointerColumn')).to.be.a(AV.Object);
46+
expect(result.avObject.get('pointerColumn').id).to.be('55069e5be4b0c93838ed8e6c');
47+
expect(result.avObject.get('relationColumn')).to.be.a(AV.Relation);
48+
expect(result.avObject.get('relationColumn').targetClassName).to.be('TestObject');
49+
expect(result.avObject.get('geopointColumn')).to.be.a(AV.GeoPoint);
50+
expect(result.avObject.get('geopointColumn').latitude).to.be(0);
51+
expect(result.avObject.get('geopointColumn').longitude).to.be(30);
52+
expect(result.avObject.get('dateColumn')).to.be.a(Date);
53+
expect(result.avObject.get('dateColumn').toISOString()).to.be('2015-05-14T06:24:47.000Z');
54+
expect(result.avObject.get('fileColumn')).to.be.a(AV.File);
55+
expect(result.avObject.get('fileColumn').name()).to.be('ttt.jpg');
56+
expect(result.avObject.get('fileColumn').url()).to.be('http://ac-4h2h4okw.clouddn.com/4qSbLMO866Tf4YtT9QEwJwysTlHGC9sMl7bpTwhQ.jpg');
57+
58+
result.avObjects.forEach(function(object) {
59+
expect(object).to.be.a(AV.Object);
60+
expect(object.className).to.be('ComplexObject');
61+
});
62+
});
63+
});
64+
65+
it('receive bare AVObject', function() {
66+
return AV.Cloud.rpc('bareAVObject').then(function(result) {
67+
expect(result).to.be.a(AV.Object);
68+
expect(result.className).to.be('ComplexObject');
69+
expect(result.get('fileColumn')).to.be.a(AV.File);
70+
});
71+
});
72+
73+
it('receive array of AVObjects', function() {
74+
return AV.Cloud.rpc('AVObjects').then(function(result) {
75+
result.forEach(function(object) {
76+
expect(object).to.be.a(AV.Object);
77+
expect(object.className).to.be('ComplexObject');
78+
});
79+
});
80+
});
81+
82+
it('send AVObject', function() {
83+
var avObject = new AV.Object('ComplexObject');
84+
var avObjectItem = new AV.Object('ComplexObject');
85+
86+
avObject.set({
87+
name: 'avObject',
88+
pointerColumn: AV.Object.createWithoutData('_User', '55069e5be4b0c93838ed8e6c')._toPointer()
89+
});
90+
91+
avObjectItem.set({
92+
name: 'avObjects'
93+
});
94+
95+
return AV.Object.saveAll([avObject, avObjectItem]).then(function() {
96+
return AV.Cloud.rpc('testAVObjectParams', {
97+
avObject: avObject,
98+
avFile: AV.File.withURL('hello.txt', 'http://ac-1qdney6b.qiniudn.com/3zLG4o0d27MsCQ0qHGRg4JUKbaXU2fiE35HdhC8j.txt'),
99+
avObjects: [avObjectItem]
100+
});
101+
});
102+
});
103+
104+
it('send bare AVObject', function() {
105+
var avObject = new AV.Object('ComplexObject');
106+
107+
avObject.set({
108+
name: 'avObject',
109+
avFile: AV.File.withURL('hello.txt', 'http://ac-1qdney6b.qiniudn.com/3zLG4o0d27MsCQ0qHGRg4JUKbaXU2fiE35HdhC8j.txt')
110+
});
111+
112+
return AV.Cloud.rpc('testBareAVObjectParams', avObject);
113+
});
114+
});
115+
116+
after(function() {
117+
AV.serverURL = originalServerURL;
118+
AV.applicationId = originalAppId;
119+
AV.applicationKey = originalAppKey;
120+
AV._useMasterKey = originalUseMasterKey;
121+
});
14122
});

test/test.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
<script src="status.js"></script>
3737
<script src="sms.js"></script>
3838
<script src="search.js"></script>
39+
<script src="cloud.js"></script>
3940
<script>
4041
onload = function(){
4142
mocha.checkLeaks();

0 commit comments

Comments
 (0)