У меня очень раздражающая проблема в 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();
});
}
Есть мысли по этому поводу? Любое решение / попытка будет оценено, большое спасибо!