Search code examples
javascriptnode.jsmongodbcsvfeathersjs

How resolve request entity too large error in feathersjs?


I'm uploading csv file in feathers service and the file size is 203kb, it throw an error request entity too large error something like this.

error:

{
    "name": "GeneralError",
    "message": "request entity too large",
    "code": 500,
    "className": "general-error",
    "data": {},
    "errors": {}
}

i'm writing middle ware code something like this but i can't able to resolve

app.js:

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

location.service.js:

// Initializes the `location` service on path `/location`
const createService = require('feathers-mongoose');
const createModel = require('../../models/location.model');
const hooks = require('./location.hooks');
const filters = require('./location.filters');
const multer = require('multer');
const multipartMiddleware = multer();

module.exports = function () {
  const app = this;
  const Model = createModel(app);
  const paginate = app.get('paginate');

  const options = {
    name: 'location',
    Model,
    paginate
  };

  // Initialize our service with any options it requires
  app.use('/location',
      multipartMiddleware.single('uri'),
        (req, res, next) => {
            req.feathers.file = req.file;
            next();
        },
    createService(options)
  );

  // Get our initialized service so that we can register hooks and filters
  const service = app.service('location');

  service.hooks(hooks);

  if (service.filter) {
    service.filter(filters);
  }
};

location.hooks.js:

const { authenticate } = require('feathers-authentication').hooks;

module.exports = {
  before: {
    all: [ authenticate('jwt') ],
    find: [],
    get: [],
    create: [function(hook, next){

        var tHeader = Object.keys(hook.data)[0].split('\n')[0].replace(/\r?\n|\r/g, " ").split(',');
        var s = Object.keys(hook.data)[0].split('\n');
            s.shift();
        var tBody = s.map(d=> d.replace(/\r?\n|\r/g, " ").split(','));
        var jointObj = [];

        const mergeArrToJSON = (a, b) => a
            .map((item, i) => ({[item.replace(/\s+/g,'')]: b[i]}))
            .reduce((json,val)=>Object.assign({},json,val));

        tBody.forEach(p1=>{
            var a = tHeader, b = p1;
            jointObj.push(mergeArrToJSON(a,b))
        })

        var insertObj = [];
        jointObj.pop()
        jointObj.forEach(d=>{
            var Obj = {};
            for(k in d) {
                var f = /[/]/;
                if(f.test(k) == true){
                    var s = k.split('/');
                    if(Obj.hasOwnProperty(s[0]) !== true){
                        Obj[s[0]] = {[s[1].charAt(0).toLowerCase() + s[1].slice(1)]:d[k]};
                    } else {
                        Obj[s[0]][s[1].replace(/\s+/g,'')] = d[k].replace(/\s+/g,'');
                    }
                } else {
                    Obj[k] = d[k];
                }
            }
            insertObj.push(Obj)
        });

        hook.data = insertObj;
        next();
    }],
    update: [],
    patch: [],
    remove: []
  },

  after: {
    all: [],
    find: [],
    get: [],
    create: [],
    update: [],
    patch: [],
    remove: []
  },

  error: {
    all: [],
    find: [],
    get: [],
    create: [],
    update: [],
    patch: [],
    remove: []
  }
};

i'm using postman to upload csv file

enter image description here


Solution

  • I have change code in app.js file

    before:

    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({ extended: true }));
    

    after:

    app.use(bodyParser.json({limit: '100mb'}));
    app.use(bodyParser.urlencoded({
      limit: '100mb',
      extended: true
    }));