clannad
Version:
data storage service with RESTful APIs.
287 lines (208 loc) • 7.94 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _regenerator = require('babel-runtime/regenerator');
var _regenerator2 = _interopRequireDefault(_regenerator);
var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator');
var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);
var _promise = require('babel-runtime/core-js/promise');
var _promise2 = _interopRequireDefault(_promise);
var _koa = require('koa');
var _koa2 = _interopRequireDefault(_koa);
var _mongoose = require('mongoose');
var _mongoose2 = _interopRequireDefault(_mongoose);
var _coBody = require('co-body');
var _coBody2 = _interopRequireDefault(_coBody);
var _asyncBusboy = require('async-busboy');
var _asyncBusboy2 = _interopRequireDefault(_asyncBusboy);
var _koaRouter = require('koa-router');
var _koaRouter2 = _interopRequireDefault(_koaRouter);
var _routes = require('./routes');
var _routes2 = _interopRequireDefault(_routes);
var _auth = require('./controllers/auth');
var _auth2 = _interopRequireDefault(_auth);
var _table = require('./controllers/table');
var _table2 = _interopRequireDefault(_table);
var _resterror = require('./services/resterror');
var _resterror2 = _interopRequireDefault(_resterror);
var _file = require('./controllers/file');
var _file2 = _interopRequireDefault(_file);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var app = new _koa2.default();
var userRouters = new _koaRouter2.default();
_mongoose2.default.Promise = _promise2.default;
app.use(function () {
var ref = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee2(ctx, next) {
var start, getBody, _ref, files, fields, status, name, message, errors, ms;
return _regenerator2.default.wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
start = new Date();
ctx.type = 'json';
_context2.prev = 2;
if (!(ctx.method === 'OPTIONS')) {
_context2.next = 7;
break;
}
_context2.next = 6;
return _auth2.default.setCORS(ctx, true);
case 6:
return _context2.abrupt('return', ctx.status = 200);
case 7:
// 直接解析出post参数, 这里的co-body 的 parse 总是有神奇的 bug
getBody = function () {
var ref = (0, _asyncToGenerator3.default)(_regenerator2.default.mark(function _callee() {
var type;
return _regenerator2.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
type = ctx.headers['content-type'];
if (!(type.indexOf('application/json') > -1)) {
_context.next = 10;
break;
}
_context.next = 4;
return _coBody2.default.json(ctx);
case 4:
_context.t0 = _context.sent;
if (_context.t0) {
_context.next = 7;
break;
}
_context.t0 = {};
case 7:
ctx.req.body = _context.t0;
_context.next = 25;
break;
case 10:
if (!(type.indexOf('application/x-www-from-urlencoded') > -1)) {
_context.next = 19;
break;
}
_context.next = 13;
return _coBody2.default.form(ctx);
case 13:
_context.t1 = _context.sent;
if (_context.t1) {
_context.next = 16;
break;
}
_context.t1 = {};
case 16:
ctx.req.body = _context.t1;
_context.next = 25;
break;
case 19:
_context.next = 21;
return (0, _coBody2.default)(ctx);
case 21:
_context.t2 = _context.sent;
if (_context.t2) {
_context.next = 24;
break;
}
_context.t2 = {};
case 24:
ctx.req.body = _context.t2;
case 25:
case 'end':
return _context.stop();
}
}
}, _callee, undefined);
}));
return function getBody() {
return ref.apply(this, arguments);
};
}();
if (!ctx.request.is('multipart/*')) {
_context2.next = 18;
break;
}
_context2.next = 11;
return (0, _asyncBusboy2.default)(ctx.req, { autoFields: true });
case 11:
_ref = _context2.sent;
files = _ref.files;
fields = _ref.fields;
ctx.req.body = fields;
ctx.req.files = files;
_context2.next = 21;
break;
case 18:
if (!(ctx.method !== 'GET' && ctx.method !== 'OPTIONS')) {
_context2.next = 21;
break;
}
_context2.next = 21;
return getBody();
case 21:
_context2.next = 23;
return next();
case 23:
if (!ctx.body) {
_context2.next = 27;
break;
}
ctx.status = 200;
_context2.next = 32;
break;
case 27:
if (!ctx.params) {
_context2.next = 31;
break;
}
ctx.status = 204;
// 处理报错情况
_context2.next = 32;
break;
case 31:
throw new _resterror2.default(ctx.status, 'ROUTER_ERR', ctx.response.message);
case 32:
_context2.next = 43;
break;
case 34:
_context2.prev = 34;
_context2.t0 = _context2['catch'](2);
process.stderr.write(_context2.t0.stack + '\n');
status = _context2.t0.status;
name = _context2.t0.name;
message = _context2.t0.message;
errors = _context2.t0.errors;
ctx.status = status || 500;
if (name) ctx.body = { name: name, message: message, errors: errors };
case 43:
ms = new Date() - start;
process.stderr.write(ctx.method + ' ' + ctx.url + ' - ' + ms + 'ms\n');
case 45:
case 'end':
return _context2.stop();
}
}
}, _callee2, undefined, [[2, 34]]);
}));
return function (_x, _x2) {
return ref.apply(this, arguments);
};
}());
app.use(_routes2.default.routes());
app.use(userRouters.routes());
exports.default = {
app: app,
auth: function auth(callback) {
var name = arguments.length <= 1 || arguments[1] === undefined ? 'REST' : arguments[1];
_auth2.default.name = name;
_auth2.default.check = callback;
},
configDB: function configDB(callback) {
callback(_mongoose2.default);
},
configIO: function configIO(config) {
_file2.default.config = config;
},
router: userRouters
};
module.exports = exports['default'];