在 redux 的 post 请求中发送大型 json 数据

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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 看起来像这样:

以上是关于在 redux 的 post 请求中发送大型 json 数据的主要内容,如果未能解决你的问题,请参考以下文章

React Redux Axios:POST 请求未收到来自 redux 状态的凭据

axios 不会将 post 数据发送到后端

Fetch Post 在 redux-saga 中不起作用?

如何使用 React Redux 发出 post 请求?

Vue JS Axios Post 请求向 PHP 发送 Null

Json-server 使用 React js 和 Redux 响应错误 404 not found Post Method