PayloadTooLargeError: request entity too large错误解决

Posted 北风几吹夏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PayloadTooLargeError: request entity too large错误解决相关的知识,希望对你有一定的参考价值。

这个错误通常是由于你正在尝试上传大于服务器最大允许大小的文件或数据导致的。这通常可以通过在服务器端进行一些配置更改来解决。

如果您使用的是Node.js,您可以使用body-parser中间件来增加请求体的限制。例如,以下代码将允许请求体的最大大小为10MB:

var bodyParser = require(\'body-parser\');
app.use(bodyParser.json(limit: \'10mb\', extended: true)); 

如果您使用的是Express框架,则可以在应用程序级别或路由级别上使用此中间件。请注意,此代码必须放置在处理POST请求之前。

另外,请确保您的客户端也不会超出服务器所支持的最大请求大小。某些客户端库也有类似的配置选项,例如,在使用Axios发送POST请求时,您可以在配置对象中设置"maxContentLength"选项。

总之,您需要检查服务器和客户端两端的请求大小限制,并相应地更新它们的配置以满足您的需求。

Node.js:req.params 与 req.body

【中文标题】Node.js:req.params 与 req.body【英文标题】:Node.js: req.params vs req.body 【发布时间】:2014-09-18 12:21:25 【问题描述】:

我一直在拼凑来自几个不同教程的代码,用 MEAN 堆栈构建一个基本的 todo 应用程序,使用 node、express、angular 和 mongodb。一个教程涵盖了为 GET、POST 和 DELETE 操作创建 api,但忽略了 POST。因此,我将编写一个更新现有待办事项的函数视为一项挑战。当我让函数工作时,我遇到了一个我不理解的涉及 req.params 的错误。

相关代码:

节点:

在 app.js 中

app.put('/api/todos/:_id', ngRoutes.update);

导致:

exports.update = function(req, res)
    var user_id = req.cookies ?
        req.cookies.user_id : undefined;

    Todo.findByIdAndUpdate(req.params._id, 
         $set:  
            updated_at : Date.now(), 
            content : req.body.formText
        , function (err, todo) 
    if (err) 
        res.send(err)
    Todo.find( user_id : user_id, function(err, todos) 
        if (err) res.send(err);
        res.json(todos);
    );
    );
    ;

角度:

    $scope.update = function(id) 
        $http.put('/api/todos/' + id, this.todo)            
        .success(function(data) 
                    console.log(data);
                    $scope.todos = data;
                )
                .error(function(data) 
                    console.log('Error: ' + data);
                );
  ;

翡翠/HTML:

form(ng-submit="update(todo._id)")
    input.update-form(ng-show="todo.updating" type="text", name="content", ng-model="todo.formText" placeholder="todo.content")

这个功能很好用。它更新有问题的待办事项,并返回整个列表以重新加载到具有更新值的页面上。

但是,如果在节点代码中,我会改变

content : req.body.formText

content : req.params.formText

我收到以下错误作为我的 HTTP 响应:

Object  
message: "Cast to string failed for value "undefined" at path "content"", 
name: "CastError", 
type: "string", 
path: "content" 

即使在函数的其他地方,

req.params._id

可以很好地检索 todo 的 '_id' 属性并使用它在数据库中查找适当的文档。此外,在 Firefox 的开发者工具中查看请求时,待办事项对象以 JSON 格式显示在“参数”选项卡下。

为什么会这样?使用 req.params 与 req.body 有什么区别,为什么第二个有效而第一个无效?

【问题讨论】:

【参考方案1】:

req.params是你在请求url参数中发送的部分或者请求的头部部分。

req.params example in postman

In example above req.params is the data we are sending in postman after ninjas in the 
url.


    route.delete('/ninjas/:id',function(req,res,next)

    Ninja.findByIdAndRemove(_id:req.params.id).then(function(ninja)
    
        console.log(ninja.toString());
        res.send(ninja);
    )
    .catch(next);

);

req.body is the part you send in body part of requests

req.body example in postman

req.body 是我们在 postman 中发送的 JSON 数据,因此我们可以在 post 请求正文部分访问它。

route.post('/ninjas',function(req,res,next)

    Ninja.create(req.body).then(function(ninja)
    
        console.log("POST"+req.body);
    res.send(ninja);
    )
    .catch(next);

);

【讨论】:

【参考方案2】:

req.params 用于路由参数,而不是您的表单数据。

你在这条路线中唯一的参数是_id

app.put('/api/todos/:_id', ...)

来自文档:

req.params 此属性是一个包含映射到的属性的对象 命名的路线“参数”。例如,如果您有路线 /user/:name,则“name”属性可用作 req.params.name。 此对象默认为 。

来源:http://expressjs.com/en/4x/api.html#req.params

req.body 包含请求中提交的数据键值对 身体。默认情况下,它是未定义的,并在您使用时填充 body-parser、multer等body-parser中间件。

来源:http://expressjs.com/en/4x/api.html#req.body

【讨论】:

谢谢!这对我来说很清楚。我仍然对 Firefox 开发人员工具中的“Params”指的是什么感到有些困惑,这导致了我的困惑,但这似乎只是指代请求正文/有效负载的另一种方式。 这对我也有帮助。在 param、params、form-data 和 x-www-form-urlencoded 之间使用 Postman 时,我感到很困惑。我用它来测试一个带有 PassportJS 的 Node/Express API,起初我不明白为什么我只得到一些用户字段。我不得不使用 x-www-form-urlencoded、req.body 和 passReqToCallback : true

以上是关于PayloadTooLargeError: request entity too large错误解决的主要内容,如果未能解决你的问题,请参考以下文章

PayloadTooLargeError: request entity too large错误解决

Firebase Firestore onSnapshot PayloadTooLargeError:Expo / React Native 项目上的请求实体太大

req.path、req.params 和 req.query 有啥区别?

Node.js:req.query[] 和 req.params 之间的区别

通过 Firebase 函数触发器在没有 req/res 对象的情况下调用 cors(req,res,() => )

Node.js:req.params 与 req.body