【问题标题】:Maximum call stack size exceeded when sending a post request in express以快递方式发送发布请求时超出最大调用堆栈大小
【发布时间】:2020-02-27 16:43:11
【问题描述】:

'RangeError: Maximum call stack size exceeded' when sent a post request, Node.js, body-parser, express

我是 node.js 的新手,在关注 node.js 和 express 的本教程系列的 video #30 时遇到了问题 我完全不知道为什么会这样。

我正在观看有关帖子的视频,教程让我为'/contact' 页面设置了一个 app.post,如下所示,但是当我提交时,我收到了下面的错误。如果我注释掉 app.post 代码一切正常,所以我认为这就是它的破坏。

const express = require('express');
const bodyParser = require('body-parser');
const app = express();

const urlencodedParser = app.use(bodyParser.urlencoded({ extended: false }));

app.set('view engine', 'ejs');
app.use('/assets', express.static('assets'));

app.get('/', function(req, res){
  res.render('index');
});

app.get('/contact', function(req, res){
  res.render('contact', {qs: req.query});
});

app.post('/contact', urlencodedParser, function(req, res){
  console.log(req.body);
  res.render('contact', {qs: req.query});
});

app.get('/profile/:id', function(req, res){
  var data = { age: 29, job: "ninja", hobbies: ['eating', 'fighting', 'fishing'] };
  res.render('profile', {person: req.params.id, data: data});
});

app.listen(3000);

/contact page:

<html lang="en" dir="ltr">
  <head>
    <style media="screen">
      body{
        background: skyblue;
        font-family: verdana;
        color: #fff;
        padding: 30px;
      }
      h1{
        font-size: 48px;
        text-transform: uppercase;
        letter-spacing: 2px;
        text-align: center;
      }
      p{
        font-size: 16px;
        text-align: center;
      }
    </style>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    <%- include ('partials/nav') %>
    <h1>Contact Us!</h1>
    <p>Contact the coolest cats on the web right here...</p>

    <form id="contact-form" method="POST" action="/contact">
      <label for="who">Who do you want to contact</label>
      <input type="text" name="who" value="<%= qs.person %>">
      <label for="department">Which department?</label>
      <input type="text" name="department" value="<%= qs.dept %>" >
      <label for="email">Your email</label>
      <input type="email" name="email" >
      <input type="submit" name="submit" >
    </form>
  </body>
</html>

错误:

RangeError: Maximum call stack size exceeded
    at /home/gavin/Documents/nodeJsTutorials-master/node_modules/express/lib/router/index.js:629:19
    at next (/home/gavin/Documents/nodeJsTutorials-master/node_modules/express/lib/router/index.js:210:14)
    at next (/home/gavin/Documents/nodeJsTutorials-master/node_modules/express/lib/router/route.js:127:14)
    at Layer.handle_error (/home/gavin/Documents/nodeJsTutorials-master/node_modules/express/lib/router/layer.js:67:12)
    at next (/home/gavin/Documents/nodeJsTutorials-master/node_modules/express/lib/router/route.js:135:13)
    at /home/gavin/Documents/nodeJsTutorials-master/node_modules/express/lib/router/index.js:635:15
    at next (/home/gavin/Documents/nodeJsTutorials-master/node_modules/express/lib/router/index.js:260:14)
    at Layer.handle [as handle_request] (/home/gavin/Documents/nodeJsTutorials-master/node_modules/express/lib/router/layer.js:97:5)
    at trim_prefix (/home/gavin/Documents/nodeJsTutorials-master/node_modules/express/lib/router/index.js:317:13)
    at /home/gavin/Documents/nodeJsTutorials-master/node_modules/express/lib/router/index.js:284:7

【问题讨论】:

  • 您说它在您注释掉 app.post 时有效。你注释掉了函数的哪一部分?我注意到的一件事是您返回的是 res.render('contact', {qs: req.query}) 而不是 res.render('contact-success', {data: req.body})
  • @leosteffen 我从 app.post 开始注释掉了整个事情。我可以用 return null 替换函数中的所有内容;它仍然给出相同的错误,所以当我提出请求时问题似乎正在发生。另外,您如何使您的评论部分具有灰色边框和计算机字体?
  • 酷。我还注意到您的 html 中的另外两件事,其中之一可能是给您带来麻烦的原因。 1 - 你没有关闭 - 试试&lt;input type="email" name="email" &gt; 2 - 你的表单输入被声明为命名输入,你需要一个值来使提交工作。试试&lt;input type="submit" value="submit" /&gt;(还要注意关闭输入标签/&gt;,因为你也错过了那里。至于灰色边框,使用反引号` `

标签: javascript node.js express


【解决方案1】:

此时,app.use 使用为每条路由添加 body parser... 但是正如您所看到的,您也将它作为中间件传递到您的发布路线中......

 const urlencodedParser = app.use(bodyParser.urlencoded({ extended: false }));

    app.post('/contact', urlencodedParser, function(req, res){
      console.log(req.body);
      res.render('contact', {qs: req.query});
    });

所以...一方面,删除 app.use

// const urlencodedParser = app.use(bodyParser.urlencoded({ extended: false }));

    app.post('/contact', bodyParser.urlencoded({ extended: false }), function(req, res){
      console.log(req.body);
      res.render('contact', {qs: req.query});
    });

另一方面,从你的 post 路由中删除中间件

 const urlencodedParser = app.use(bodyParser.urlencoded({ extended: false }));

    app.post('/contact', function(req, res){
      console.log(req.body);
      res.render('contact', {qs: req.query});
    });

PS:

或者也许只是你没有使用 body parser 的变量,因为你应该使用它,也许做这样的事情:

 const urlencodedParser = bodyParser.urlencoded({ extended: false });

    app.post('/contact', urlencodedParser, function(req, res){
      console.log(req.body);
      res.render('contact', {qs: req.query});
    });

【讨论】:

  • 谢谢,这解决了这个问题,我真的明白为什么它现在不起作用了。希望我可以投票,但我刚刚创建了这个帐户。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-18
  • 1970-01-01
  • 2015-10-24
  • 2015-12-29
相关资源
最近更新 更多