datoit
Version:
An open source headless CMS solution to create and manage your own API. It provides a powerful dashboard and features to make your life easier. Databases supported: MongoDB, MySQL, MariaDB, PostgreSQL, SQLite
72 lines (64 loc) • 1.7 kB
JavaScript
;
const body = require('koa-body');
const qs = require('qs');
const { omit } = require('lodash');
/**
* Body parser hook
*/
const addQsParser = (app, settings) => {
Object.defineProperty(app.request, 'query', {
configurable: false,
enumerable: true,
/*
* Get parsed query-string.
*/
get() {
const qstr = this.querystring;
const cache = (this._querycache = this._querycache || {});
return cache[qstr] || (cache[qstr] = qs.parse(qstr, settings));
},
/*
* Set query-string as an object.
*/
set(obj) {
this.querystring = qs.stringify(obj);
},
});
return app;
};
module.exports = strapi => {
return {
/**
* Initialize the hook
*/
initialize() {
strapi.app.use(async (ctx, next) => {
// disable for graphql
// TODO: find a better way later
if (ctx.url === '/graphql') {
return next();
}
try {
const res = await body({
patchKoa: true,
...omit(strapi.config.middleware.settings.parser, 'queryStringParser'),
})(ctx, next);
return res;
} catch (e) {
if ((e || {}).message && e.message.includes('maxFileSize exceeded')) {
throw strapi.errors.entityTooLarge('FileTooBig', {
errors: [
{
id: 'Upload.status.sizeLimit',
message: `file is bigger than the limit size!`,
},
],
});
}
throw e;
}
});
addQsParser(strapi.app, strapi.config.get('middleware.settings.parser.queryStringParser'));
},
};
};