Uh oh!
There was an error while loading. Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.js
More file actions
Latest commit
113 lines (90 loc) · 2.84 KB
/
Copy pathindex.js
File metadata and controls
113 lines (90 loc) · 2.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
'use strict';
varJSONScript=require('jsonscript-js');
var_=require('lodash');
varprocessRequest=require('supertest');
module.exports=jsonscriptExpress;
varMETHODS=['get','post','put','delete'];
functionjsonscriptExpress(app,options,js){
options=_.defaults(options,{
routerExecutor: 'router',
basePath: '',
jsonscript: {strict: true},
Promise: (typeofPromise!=='undefined')&&Promise
});
varprocessResponse=processResponseFunc(options);
js=js||newJSONScript(options.jsonscript);
addExecutorMethods();
js.addExecutor(options.routerExecutor,execRouter);
evaluator.js=js;
returnevaluator;
functionevaluator(req,res){
varscript=req.body.script;
vardata=req.body.data;
varvalid=js.validate(script);
if(valid){
js.evaluate(script,data)
.then(function(value){
res.json(value);
},function(err){
res.status(err.errors ? 400 : err.statusCode||500)
.send({
error: err.message,
errors: err.errors
});
});
}else{
res.status(400)
.send({
error: 'script is invalid',
errors: js.validate.errors
});
}
}
functionexecRouter(args){
varrequest=processRequest(app)[args.method](options.basePath+args.path)
.set('Accept','application/json');
if(args.headers)request.set(args.headers);
if(args.body)request.send(args.body);
returnnewoptions.Promise(function(resolve,reject){
request.end(function(err,resp){
if(err)returnreject(err);
try{resolve(processResponse(resp,args));}
catch(e){reject(e);}
});
});
}
functionaddExecutorMethods(){
METHODS.forEach(function(method){
execRouter[method]=function(args){
if(args.method&&args.method!=method){
console.warn('method specified in args ('+args.method+
') is different from $method in instruction ('+method+'), used '+method);
}
args.method=method;
returnexecRouter(args);
};
});
}
}
functionprocessResponseFunc(options){
returnoptions.processResponse=='body'
? bodyProcessResponse
: typeofoptions.processResponse=='function'
? options.processResponse
: defaultProcessResponse;
}
functionbodyProcessResponse(resp){
if(resp.statusCode<300)returnresp.body;
thrownewHttpError(resp);
}
functiondefaultProcessResponse(resp,args){
resp=_.pick(resp,'statusCode','headers','body');
resp.request=args;
returnresp;
}
functionHttpError(resp){
this.message=resp.body ? JSON.stringify(resp.body) : 'Error';
this.statusCode=resp.statusCode;
}
HttpError.prototype=Object.create(Error.prototype);
HttpError.prototype.constructor=HttpError;