длина строки в теле запроса всегда ограничена в Express && bodyparser - PullRequest
0 голосов
/ 09 мая 2018

У меня очень раздражающая проблема в express4 & body parser.

В интерфейсе я получил форму со входом, содержащим очень длинную строку, скажем, длиной 5 000 000, что близко к 5 МБ.

Как только я отправляю эту форму, я печатаю этот ввод в экспресс-маршрутах: console.log (req.body.inputname.length), странная вещь - , длина всегда ограничена 1 048 553 , что очень близко к 1 МБ. Нет ошибок / исключений.

Я уже установил предельный размер bodyparser равным 50 МБ и проверил его с помощью ввода (type = file), когда я загружаю файл большого размера, он работает, поэтому я предполагаю, что ограничение размера не является проблемой.

Обычно я загружаю изображение во внешний интерфейс для ввода (type = file), а затем во внешнем интерфейсе я использую fileReader, чтобы преобразовать его в строку base64 и отправить эту строку через запрос post. Вот почему я могу получить такую ​​длинную строку.

интерфейс (я использовал Jade и Vue)

form(method='post',action="/upload",enctype='multipart/form-data')
  input(type='file', @change='previewImages($event)', multiple='multiple')
  input.hidden-input(type='hidden' name='imagesArray' v-model='imagesArray')

script.
  //In vue instance,
  data:{
  imagesArray:[];
   }
  methods{
    previewImages(event){
       function readAndPreview(){
          let reader = new FileReader();
          reader.addEventListener("load", function (e) {
             ourVueInstance.imagesArray.push(e.target.result);},false);
          reader.readAsDataURL(file);
     }  
     [].forEach.call(event.target.files, readAndPreview);
    }
 }

маршрутизатор (с помощью приложения Express)

app.post('/upload',(req,res)=>{
//imageArray is converted to string, and its length is now limited to 1048553
console.log(req.body.imagesArray.length)
})

Настройки bodyparser

app.use(bodyParser.json({ limit: '50mb',length:'1000000000' })); 
app.use(bodyParser.urlencoded({limit:'50mb',extended: true,parameterLimit:50000,length:'1000000000'})); 

Добавлено: server.js

var cluster = require('cluster');
var sticky  = require('sticky-cluster');
var util    = require('./util/util.js');
var fs = require('fs');
var ejs = require('ejs');
var session = require('express-session');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var i18n = require('i18n-express');
var mongoose = require('mongoose');
var MongoStore = require('connect-mongo')(session);
var morgan =  require('morgan');
var flash = require('connect-flash');
var config = require('./config/config.json');
var log = require('./util/log.js').getLogger(__filename);
var passport = require('passport');
var validator =  require('express-validator');
var port = config.our_SERVER_PORT;
var sslport = config.our_SERVER_SSL_PORT;

const fileUpload = require('express-fileupload');

//var LocalStrategy = require('passport-local').Strategy;
require('./config/passport');

// running applications on the master process
var express = require('express');
var app = express();

app.use(fileUpload());
app.use(morgan('dev'));  // log every request to the console
app.use(express.static(__dirname + '/public'));
app.use(express.static(config.IMAGE_BASE_PATH));

//initialize the DB connections
//load configuration details from the server configuration JSON
var dbURL = config.DB_URL;
log.info("Initializing the DB connection. " + dbURL);
mongoose.Promise = global.Promise;
mongoose.connect(dbURL, {useMongoClient:true});

app.use(cookieParser(config.SESSION.SESSION_SECRET)); // read cookies (needed for auth)

app.use(session({
    secret: config.SESSION.SESSION_SECRET,
    resave: true,
    saveUninitialized: true,
    store: new MongoStore({url: dbURL}),
    cookie: {maxAge: config.SESSION.COOKIE_MAXAGE_MS}
}));

app.use(passport.initialize());
app.use(passport.session()); // persistent login sessions
app.use(validator());

//sign in protection
app.use(function (req, res, next) {
    res.locals.login = req.isAuthenticated();
    res.locals.session = req.session;

    //To avoid undefined total quantity in topnavbarMain's cart
    if(!req.session.cart){
        req.session.cart={};
    }
    next();
});

//init i18n after cookie-parser
app.use(i18n({
    translationsPath: __dirname +  '/i18n',
    siteLangs: config.SUPPORTED_LANGUAGE,
    cookiename:'ulang'
}));

app.use(bodyParser.json({ limit: '50mb',length:'1000000000' })); // get information from html forms
app.use(bodyParser.urlencoded({limit:'50mb',extended: true,parameterLimit:50000,length:'1000000000'}));


app.set('views', __dirname + '/views');

app.set('view engine', "pug");
app.engine('pug', require('pug').__express);

app.use(flash());  // use connect-flash for flash message stored in session

//CA certificate for HTTPS
var options = {};
var http, https;

// sticky options
var stickySSLOptions = {
    concurrency: require('os').cpus().length,
    //concurrency:1,
    port: config.our_SERVER_SSL_PORT,
    debug: true
};

// sticky options
var stickyOptions = {
    concurrency: require('os').cpus().length,
    //concurrency:1,
    port: config.our_SERVER_PORT,
    debug: true
};

// configuration enables the CA cert with SSL enabled
if (config.CA_CERT.SSL_ENABLED) {

    sticky(
        // server initialization function
        function(callback) {
            options = {
                ca   : fs.readFileSync(__dirname + '/cert/' + config.CA_CERT.SSL_CA),
                key  : fs.readFileSync(__dirname + '/cert/' + config.CA_CERT.SSL_KEY),
                cert : fs.readFileSync(__dirname + '/cert/' + config.CA_CERT.SSL_CERT),
                passphrase: config.CA_CERT.passphrase
            };

            https = require('https').createServer(options, app);

            callback(https);
        },

        stickySSLOptions
    );

}
else {
    // non SSL
    sticky(
        function(callback) {
            http = require('http').createServer(app);

            callback(http);
        },

        stickyOptions
    );
}

//routes
//require routes goes here. I will not list them for space. 


/******************************************************
 * error handlers
 ******************************************************/
// catch 404 and forward to error handler
app.use(function(req, res, next) {
    let err = new Error('.............');
    err.status = 404;
    next(err);
});

// error handler
app.use(function(err, req, res, next) {
    // set locals, only providing error in development
    res.locals.errMsg = err.message;
    res.locals.error = req.app.get('env') === 'development' ? err : {};

    // render the error page
    res.status(err.status || 500);
    res.render('common/error');
});


//check if we are running master process
if (cluster.isMaster) {
    // Listen for dying workers
    cluster.on('exit', function (worker) {
        // Replace the dead worker
        console.log('Worker %d died :(', worker.id);
        log.info("Worker " +  worker.id + " died. Replace with a new worker to serve for the application.");
        cluster.fork();
    });
}

Есть мысли по этому поводу? Любое решение / попытка будет оценено, большое спасибо!

...