Skip to content

Commit aa17823

Browse files
committed
Merge branch 'timeout' of https://github.com/sdjcw/leanengine-node-sdk into sdjcw-timeout
Conflicts: lib/leanengine.js
2 parents 8fdfe23 + 4346527 commit aa17823

3 files changed

Lines changed: 35 additions & 6 deletions

File tree

lib/leanengine.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ var connect = require('connect'),
44
https = require('https'),
55
domain = require('domain'),
66
crypto = require('crypto'),
7+
timeout = require('connect-timeout'),
78
version = require('../package.json').version,
89
AV = require('./av-extra'),
910
utils = require('./utils'),
@@ -31,6 +32,8 @@ if (https.globalAgent && https.globalAgent.options) {
3132
https.globalAgent.options.rejectUnauthorized = false;
3233
}
3334

35+
var TIMEOUT = '15s';
36+
3437
AV.Cloud.CookieSession = avosExpressCookieSession(AV);
3538
AV.Cloud.HttpsRedirect = avosExpressHttpsRedirect(AV);
3639

@@ -59,6 +62,7 @@ Cloud.use('/__engine/1/ping', function(req, res) {
5962
next();
6063
});
6164

65+
Cloud.use(route, timeout(TIMEOUT));
6266
Cloud.use(route, bodyParser.urlencoded({extended: false, limit: '40mb'}));
6367
Cloud.use(route, bodyParser.json({limit: '40mb'}));
6468
Cloud.use(route, bodyParser.text({limit: '40mb'}));
@@ -72,7 +76,7 @@ Cloud.use('/__engine/1/ping', function(req, res) {
7276
d.add(req);
7377
d.add(res);
7478
d.on('error', function(err) {
75-
console.error('LeanEngine function uncaughtException url=%s, msg=%s', req.url, err.stack || err.message || err);
79+
console.error('LeanEngine function uncaughtException url=%s, msg=%s', req.originalUrl, err.stack || err.message || err);
7680
if(!res.finished) {
7781
res.statusCode = 500;
7882
res.setHeader('content-type', 'application/json; charset=UTF-8');
@@ -262,6 +266,11 @@ Cloud.use('/__engine/1/ping', function(req, res) {
262266

263267
// next 参数即使不使用,也一定要存在,否则 error handler 不生效
264268
Cloud.use(route, function(err, req, res, next) { // jshint ignore:line
269+
if(req.timedout) {
270+
console.error('LeanEngine function timeout, url=%s, timeout=%d', req.originalUrl, err.timeout);
271+
err.code = 124; // https://leancloud.cn/docs/error_code.html#_124
272+
err.message = 'The request timed out on the server.';
273+
}
265274
respError(res, err);
266275
});
267276
});

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
"avoscloud-sdk": "0.x",
1111
"body-parser": "1.9.0",
1212
"connect": "3.2.0",
13+
"connect-timeout": "^1.7.0",
1314
"cookies": "0.5.0",
1415
"debug": "2.0.0",
1516
"iconv-lite": "^0.4.8",

test/function_test.js

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,12 @@ AV.Cloud.define("userMatching", function(req, res) {
211211
}, Math.floor((Math.random() * 2000) + 1));
212212
});
213213

214+
AV.Cloud.define('testTimeout', function(req, res) {
215+
setTimeout(function() {
216+
res.success('ok');
217+
}, req.params.delay);
218+
});
219+
214220
AV.Insight.on('end', function(err, result) {
215221
assert.deepEqual({
216222
"id" : "job id",
@@ -472,7 +478,6 @@ describe('functions', function() {
472478

473479
// 测试带有 sessionToken 时,user 对象的正确解析
474480
it('testUser', function(done) {
475-
this.timeout(5000);
476481
request(AV.Cloud)
477482
.post('/1/functions/testUser')
478483
.set('X-AVOSCloud-Application-Id', appId)
@@ -483,7 +488,6 @@ describe('functions', function() {
483488

484489
// 无效 sessionToken 测试
485490
it('testUser_invalid_sessionToken', function(done) {
486-
this.timeout(5000);
487491
request(AV.Cloud)
488492
.post('/1/functions/testUser')
489493
.set('X-AVOSCloud-Application-Id', appId)
@@ -498,7 +502,6 @@ describe('functions', function() {
498502

499503
// 测试调用 run 方法时,传递 user 对象的有效性
500504
it('testRunWithUser', function(done) {
501-
this.timeout(5000);
502505
request(AV.Cloud)
503506
.post('/1/functions/testRunWithUser')
504507
.set('X-AVOSCloud-Application-Id', appId)
@@ -509,7 +512,6 @@ describe('functions', function() {
509512

510513
// 测试调用 run 方法 options callback
511514
it('testRun_options_callback', function(done) {
512-
this.timeout(5000);
513515
request(AV.Cloud)
514516
.post('/1/functions/testRun_options_callback')
515517
.set('X-AVOSCloud-Application-Id', appId)
@@ -520,7 +522,6 @@ describe('functions', function() {
520522

521523
// 测试调用 run 方法,返回值是 promise 类型
522524
it('testRun_promise', function(done) {
523-
this.timeout(5000);
524525
request(AV.Cloud)
525526
.post('/1/functions/testRun_promise')
526527
.set('X-AVOSCloud-Application-Id', appId)
@@ -574,6 +575,24 @@ describe('functions', function() {
574575
});
575576
});
576577

578+
it('timeoutTest', function(done) {
579+
this.timeout(17000);
580+
request(AV.Cloud)
581+
.post('/1.1/functions/testTimeout')
582+
.set('X-AVOSCloud-Application-Id', appId)
583+
.set('X-AVOSCloud-Application-Key', appKey)
584+
.send({
585+
delay: 15200,
586+
})
587+
.expect(503)
588+
.end(function(err, res) {
589+
res.body.should.eql({code:124, error:"The request timed out on the server."});
590+
setTimeout(function() { // 等待业务逻辑真正响应,确认异常信息
591+
done();
592+
}, 1000);
593+
});
594+
});
595+
577596
// 用户串号测试
578597
it('user_matching_func', function(done) {
579598
this.timeout(30000);

0 commit comments

Comments
 (0)