Skip to content

Commit bdb8c83

Browse files
committed
Merge pull request #19 from sdjcw/master
修正 AV.Cloud.httpRequest 找不到 qs 没有定义的错误
2 parents 26a7432 + 0228da4 commit bdb8c83

11 files changed

Lines changed: 111 additions & 50 deletions

File tree

.jshintrc

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"strict": true,
3+
"undef": true,
4+
"unused": true,
5+
"node": true,
6+
"globals" : {
7+
"describe" : false,
8+
"it" : false,
9+
"before" : false,
10+
"beforeEach" : false,
11+
"after" : false,
12+
"afterEach" : false
13+
}
14+
}

lib/av-extra.js

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1+
'use strict';
12
var http = require('http');
23
var https = require('https');
34
var urlParser = require('url');
45
var util = require('util');
5-
var querystring = require('querystring');
6+
var qs = require('querystring');
67
var iconvlite = require('iconv-lite');
78
var AV = require('avoscloud-sdk').AV;
89
var utils = require('./utils');
@@ -12,7 +13,7 @@ var version = require('../package.json').version;
1213
// 调用 API 时增加 prod 信息
1314
if (!AV._old_request) {
1415
AV._old_request = AV._request;
15-
AV._request = function (route, className, objectId, method, dataObject, options) {
16+
AV._request = function (route, className, objectId, method, dataObject) {
1617
if (!dataObject) {
1718
dataObject = {};
1819
}
@@ -108,7 +109,7 @@ AV._ajax = function(method, url, data, success, error) {
108109
return promise._thenRunCallbacks(options);
109110
};
110111

111-
mimeTypes = [
112+
var mimeTypes = [
112113
{
113114
pattern: /^text\/plain.*/i,
114115
process: function(res) {
@@ -138,13 +139,13 @@ var trySetData = function(httpRes) {
138139
}
139140
if (type) {
140141
try {
141-
return httpRes.data = type.process(httpRes);
142+
httpRes.data = type.process(httpRes);
142143
} catch (_error) {
143144
e = _error;
144-
return httpRes.data = httpRes.buffer;
145+
httpRes.data = httpRes.buffer;
145146
}
146147
} else {
147-
return httpRes.data = httpRes.buffer;
148+
httpRes.data = httpRes.buffer;
148149
}
149150
};
150151

@@ -191,7 +192,7 @@ AV.Cloud.httpRequest = function(options) {
191192
}
192193
promise = new AV.Promise();
193194
params = options.params;
194-
headers = options.headers || '';
195+
headers = options.headers || {};
195196
method = options.method || 'GET';
196197
body = options.body;
197198
text = options.text ? options.text : true;
@@ -210,16 +211,16 @@ AV.Cloud.httpRequest = function(options) {
210211
if (params) {
211212
path = !search ? path + '?' : path + '&';
212213
if (utils.typeOf(params) === 'string') {
213-
params = querystring.parse(params);
214+
params = qs.parse(params);
214215
}
215-
params = querystring.stringify(params);
216+
params = qs.stringify(params);
216217
path = path + params;
217218
}
218-
contentType = headers['Content-Type'] || headers['content-type'];
219+
contentType = headers['Content-Type'];
219220
if ((method === 'POST') && (!contentType)) {
220221
headers['Content-Type'] = 'application/x-www-form-urlencoded; charset=utf-8';
221222
}
222-
theBody = castBody(body, headers['Content-Type'] || headers['content-type']);
223+
theBody = castBody(body, headers['Content-Type']);
223224
contentLen = theBody ? theBody.length : 0;
224225
if (!headers['Content-Length']) {
225226
headers['Content-Length'] = contentLen;

lib/avosExpressCookieSession/index.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
* update from cookie-sesion middleware
33
*/
44
(function() {
5+
'use strict';
56
var domain = require('domain');
67
var Cookies = require('cookies');
7-
var url = require('url');
88
var onHeaders = require('on-headers');
99
var debug = require('debug')('AV:cookieSession');
1010

@@ -37,7 +37,6 @@
3737
return function cookieSession(req, res, next) {
3838
var cookieSetter = function() {
3939
var cookies = req.sessionCookies = new Cookies(req, res, keys);
40-
var sess;
4140

4241
// to pass to Session()
4342
req.sessionOptions = opts;

lib/avosExpressHttpsRedirect/index.js

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/leanengine.js

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1+
'use strict';
12
var connect = require('connect'),
23
bodyParser = require('body-parser'),
34
https = require('https'),
45
domain = require('domain'),
56
crypto = require('crypto'),
67
version = require('../package.json').version,
78
AV = require('./av-extra'),
8-
utils = require('./utils');
9+
utils = require('./utils'),
910
avosExpressCookieSession = require('./avosExpressCookieSession'),
1011
avosExpressHttpsRedirect = require('./avosExpressHttpsRedirect'),
1112
debug = require('debug')('AV:LeanEngine');
@@ -43,7 +44,7 @@ Cloud.use('/__engine/1/ping', function(req, res) {
4344
['1', '1.1'].forEach(function(apiVersion) {
4445
['', '/__engine'].forEach(function(urlNamespace) {
4546
var route = '/' + apiVersion + '/functions';
46-
if (urlNamespace != '') {
47+
if (urlNamespace !== '') {
4748
route = urlNamespace + '/' + apiVersion + '/functions';
4849
}
4950

@@ -83,7 +84,7 @@ Cloud.use('/__engine/1/ping', function(req, res) {
8384

8485
// parse authInfo
8586
Cloud.use(route, function(req, res, next) {
86-
var appId, appKey, contentType, param, prod, prodHeader, prodValue, sessionToken;
87+
var appId, appKey, masterKey, contentType, param, prod, prodHeader, prodValue, sessionToken;
8788
contentType = req.headers['content-type'];
8889
if (/^text\/plain.*/i.test(contentType)) {
8990
if (req.body && req.body !== '') {
@@ -146,7 +147,10 @@ Cloud.use('/__engine/1/ping', function(req, res) {
146147
}
147148
requestSign = req.headers['x-avoscloud-request-sign'];
148149
if (requestSign) {
149-
_ref = requestSign.split(','), sign = _ref[0], timestamp = _ref[1], master = _ref[2];
150+
_ref = requestSign.split(',');
151+
sign = _ref[0];
152+
timestamp = _ref[1];
153+
master = _ref[2];
150154
key = master === 'master' ? AV.masterKey : AV.applicationKey;
151155
validSign = signByKey(timestamp, key);
152156
if (validSign === sign.toLowerCase()) {
@@ -161,7 +165,7 @@ Cloud.use('/__engine/1/ping', function(req, res) {
161165
});
162166

163167
// get metadatas func
164-
Cloud.use(route + '/_ops/metadatas', function(req, res, next) {
168+
Cloud.use(route + '/_ops/metadatas', function(req, res) {
165169
if (req.AV.authMasterKey) {
166170
return resp(res, Object.keys(Cloud.__code));
167171
}
@@ -177,7 +181,7 @@ Cloud.use('/__engine/1/ping', function(req, res) {
177181
next();
178182
},
179183
error: function(user, err) {
180-
next(err)
184+
next(err);
181185
}
182186
});
183187
} else if (req.body.user) {
@@ -210,7 +214,7 @@ Cloud.use('/__engine/1/ping', function(req, res) {
210214
var meta = {
211215
remoteAddress: req.headers['x-real-ip'] || req.headers['x-forwarded-for'] || req.connection.remoteAddress,
212216
};
213-
split = req.url.split('/');
217+
var split = req.url.split('/');
214218
if (split.length == 2) { // cloud function
215219
call(split[1], req.body, req.AV.user, meta, function(err, data) {
216220
cb(err, data);
@@ -237,9 +241,10 @@ Cloud.use('/__engine/1/ping', function(req, res) {
237241
}
238242
});
239243

240-
Cloud.use(route, function(err, req, res, next) {
244+
// next 参数即使不使用,也一定要存在,否则 error handler 不生效
245+
Cloud.use(route, function(err, req, res, next) { // jshint ignore:line
241246
respError(res, err);
242-
})
247+
});
243248
});
244249
});
245250

@@ -268,10 +273,6 @@ var respBare = function(res, data) {
268273
return res.end(JSON.stringify(data));
269274
};
270275

271-
var respOk = function(res) {
272-
resp(res, 'ok');
273-
};
274-
275276
var respError = function(res, err) {
276277
res.setHeader('Content-Type', 'application/json; charset=UTF-8');
277278
res.statusCode = err.statusCode || 400;
@@ -334,12 +335,12 @@ var hookMarks = [
334335
// 如果对象有 hook 标记,则需要明确 set 一次,标记才会保存在 changed 列表
335336
// 这样调用 REST API 时才会将标记一同传到存储服务端
336337
var setHookMark = function (obj) {
337-
for (i in hookMarks) {
338+
for (var i in hookMarks) {
338339
if (obj.get(hookMarks[i])) {
339340
obj.set(hookMarks[i], obj.get(hookMarks[i]));
340341
}
341342
}
342-
}
343+
};
343344

344345
var classHook = function(className, hook, object, user, meta, cb) {
345346
if (!Cloud.__code[hook + className]) {
@@ -349,7 +350,7 @@ var classHook = function(className, hook, object, user, meta, cb) {
349350
}
350351
var obj = createAVObject(className);
351352
obj._finishFetch(object, true);
352-
setHookMark(obj)
353+
setHookMark(obj);
353354
try {
354355
if (hook.indexOf('__after_') === 0) {
355356
// after 的 hook 不需要 response 参数,并且请求默认返回 ok
@@ -419,7 +420,7 @@ var onCompleteBigQueryJob = function(data) {
419420
} catch (err) {
420421
console.warn('Execute onCompleteBigQueryJob failed with error: ' + (err.stack || err));
421422
}
422-
}
423+
};
423424

424425
Cloud.__code = {};
425426

lib/utils.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
'use strict';
12
exports.typeOf = function(obj) {
23
var classToType;
34
if (obj === void 0 || obj === null) {

test/authorization_test.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1+
'use strict';
12
var config = require('./config'),
2-
AV = require('..'),
3-
assert = require('assert');
3+
AV = require('..');
44

55
var appId = config.appId;
66
var appKey = config.appKey;

test/av-extra_test.js

Lines changed: 46 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,54 @@
1-
var should = require('should'),
1+
'use strict';
2+
var should = require('should'), // jshint ignore:line
23
AV = require('../lib/av-extra');
34

5+
var express = require('express');
6+
var bodyParser = require('body-parser');
7+
var app = express();
8+
app.use(bodyParser.json());
9+
app.use(bodyParser.urlencoded({ extended: false }));
10+
11+
app.get('/hello', function (req, res) {
12+
res.send('Hello, ' + req.query.name);
13+
});
14+
15+
app.post('/hello', function (req, res) {
16+
res.send('Hello, ' + req.body.name);
17+
});
18+
19+
var server = app.listen(3333, function () {});
20+
21+
after(function() {
22+
server.close();
23+
});
24+
425
describe('av-extra', function() {
526
it('httpRequest', function(done) {
627
AV.Cloud.httpRequest({
7-
url: 'https://www.bing.com/search',
8-
params: { q : 'leancloud怎么样' },
9-
success: function(httpResponse) {
10-
httpResponse.status.should.equal(200);
11-
done();
28+
url: 'http://localhost:3333/hello',
29+
params: { name : '张三' },
30+
success: function(res) {
31+
res.status.should.equal(200);
32+
res.text.should.equal('Hello, 张三');
33+
done();
34+
},
35+
error: function(httpResponse) {
36+
throw httpResponse.text;
37+
}
38+
});
39+
});
40+
41+
it('httpRequest', function(done) {
42+
AV.Cloud.httpRequest({
43+
url: 'http://localhost:3333/hello',
44+
method: 'POST',
45+
body: {
46+
name: "张三"
47+
},
48+
success: function(res) {
49+
res.status.should.equal(200);
50+
res.text.should.equal('Hello, 张三');
51+
done();
1252
},
1353
error: function(httpResponse) {
1454
throw httpResponse.text;

test/function_test.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
'use strict';
12
var config = require('./config'),
23
AV = require('..'),
34
should = require('should'),
@@ -12,7 +13,6 @@ var masterKey = config.masterKey;
1213
AV.initialize(appId, appKey, masterKey);
1314

1415
var TestObject = AV.Object.extend('TestObject');
15-
var ComplexObject = AV.Object.extend('ComplexObject');
1616

1717
AV.Cloud.define('foo', function(request, response) {
1818
assert.ok(request.meta.remoteAddress);
@@ -76,7 +76,7 @@ AV.Cloud.define('testRun_options_callback', function(request, response) {
7676
assert.equal('OK~', data);
7777
AV.Cloud.run('choice', {choice: false}, {
7878
success: function(data) {
79-
assert.ifError(err);
79+
assert.ifError(data);
8080
},
8181
error: function(err) {
8282
assert.equal('OMG...', err);
@@ -137,7 +137,9 @@ AV.Cloud.onVerified('sms', function(request) {
137137
});
138138

139139
AV.Cloud.define('testThrowError', function(request, response) {
140+
/* jshint ignore:start */
140141
noThisMethod();
142+
/* jshint ignore:end */
141143
response.success();
142144
});
143145

@@ -149,7 +151,7 @@ AV.Cloud.define("userMatching", function(req, res) {
149151
success: function(obj) {
150152
assert.equal(obj.get('foo'), 'bar');
151153
res.success({reqUser: req.user, currentUser: AV.User.current()});
152-
}, error: function(err) {
154+
}, error: function() {
153155
res.success({reqUser: req.user, currentUser: AV.User.current()});
154156
}
155157
});

test/hook_test.js

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1+
'use strict';
12
var config = require('./config'),
23
AV = require('..'),
3-
should = require('should'),
4+
should = require('should'), // jshint ignore:line
45
assert = require('assert');
56

67
var appId = config.appId;
@@ -38,15 +39,15 @@ AV.Cloud.beforeSave("ErrorObject", function(request, response) {
3839
var a = {};
3940
a.noThisMethod();
4041
response.success();
41-
})
42+
});
4243

4344
AV.Cloud.afterSave("TestReview", function(request) {
4445
assert.equal(request.object.className, 'TestReview');
4546
assert.equal(request.object.id, '5403e36be4b0b77b5746b292');
4647
});
4748

48-
AV.Cloud.afterSave("TestError", function(request) {
49-
noThisMethod();
49+
AV.Cloud.afterSave("TestError", function() {
50+
noThisMethod(); // jshint ignore:line
5051
});
5152

5253
AV.Cloud.afterUpdate("TestClass", function(request) {
@@ -152,7 +153,7 @@ describe('hook', function() {
152153
var warnLogs = [];
153154
console.warn = function() {
154155
warnLogs.push(arguments);
155-
}
156+
};
156157
request(AV.Cloud)
157158
.post("/1.1/functions/ErrorObject/beforeSave")
158159
.set('X-AVOSCloud-Application-Id', appId)

0 commit comments

Comments
 (0)