【问题标题】:send large json data in post request in redux在 redux 的 post 请求中发送大型 json 数据
【发布时间】:2018-12-08 13:03:39
【问题描述】:

我需要在 post 请求中发送一个非常大的 json 数据。 在将 bodyperser 的 json 限制设置为 200mb 后,我收到 413 响应。 我在服务器上使用 nodejs,在前端使用 react 和 redux

【问题讨论】:

    标签: json redux http-post large-data body-parser


    【解决方案1】:

    app.js 文件是:

    'use strict';
    let express = require('express');
    // let server = require('http').Server(app);
    const app = express();
    let createError = require('http-errors');
    let path = require('path');
    let cookieParser = require('cookie-parser');
    let logger = require('morgan');
    let bodyParser = require('body-parser');
    
    let indexRouter = require('./routes/index');
    let apiRouter = require('./routes/api');
    
    require('./mongo_configuration/mongo')();
    require('./mongo_models/index');
    // app.use(express.static('public'));
    
    
    app.use(logger('dev'));
    app.use(express.json());
    
    // app.use(express.urlencoded({ extended: false }));
    app.use(cookieParser());
    
    
    app.use(express.static(path.join(__dirname, 'public')));
    app.use(express.static(path.join(__dirname, 'src')));
    
    
    app.set('view engine', 'html');
    app.engine('html', require('ejs').renderFile);
    app.set('views', __dirname + '/public');
    
    // app.use(bodyParser.json({limit:'200mb'}));
    // app.use(bodyParser.urlencoded({extended: true, limit:'200mb'}));
    
    
    app.use(bodyParser.urlencoded({
        parameterLimit: 100000,
        limit: '200mb',
        extended: true
    }));
    
    
    app.use('/', indexRouter);
    app.use('/api',apiRouter);
    
    app.use(function(req, res, next) {
        next(createError(404));
    });
    
    // error handler
    app.use(function(err, req, res, next) {
        // set locals, only providing error in development
        res.locals.message = err.message;
        res.locals.error = req.app.get('env') === 'development' ? err : {};
    
        // render the error page
        res.status(err.status || 500);
        res.render('error');
    });
    
    
    app.listen(3000, function(){
        console.log('App web-server listening on port 3000');
        require('./scripts/index');
    });

    【讨论】:

    • 您可以取消注释 app.use(myParser.json({limit: '200mb'}));
    • 将此代码app.use(bodyParser.urlencoded({ parameterLimit: 100000, limit: '200mb', extended: true })); 放在app.use(express.json()); 的位置后它工作了
    【解决方案2】:

    在您的代码中,您调用了两次 bodyParser.json() 和 bodyParser.urlencoded(),问题是有限制的调用在没有选项的调用之后,默认为 200kb。因此,当您发布大于 200kb 的内容时,将引发该错误,因为第一个解析器不会转到下一个中​​间件。

    你不应该调用 bodyParser[method] 两次。

    您可以更改 bodyParser 属性,如下所示

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

    【讨论】:

    • 嘿帕布,感谢您的回复。正如你所说,我已经调用了两次 bodyParser 方法是正确的。我用过 app.use(bodyParser.json({limit:'200mb'})); app.use(bodyParser.urlencoded({extended: true, limit:'200mb'}));这里的代码 app 是 expres 对象。但我在评论第二行后尝试过。它没有工作
    • 您是在本地环境还是生产环境中遇到此错误?
    • 在本地环境中
    • 我的 app.js 看起来像这样:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    • 2019-01-06
    • 2017-09-18
    • 2013-07-07
    • 2017-04-02
    相关资源
    最近更新 更多