javascript - 以express方式发送post请求时超出了最大调用堆栈大小

标签 javascript node.js express

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

我是 node.js 的新手,在关注 video #30 时遇到了问题关于 Node.js 和 Express 的本教程系列的一部分 我完全不知道为什么会发生这种情况。

我正在观看有关帖子的视频,教程让我为 '/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);

/联系页面:

<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.use 用于向每个路由添加主体解析器... 但正如您所看到的,您也将它作为中间件传递到您的发布路由中......

 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});
    });

另一方面,从发布路由中删除中间件

 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:

或者也许只是您没有使用主体解析器的变量,因为您应该使用它,也许可以做这样的事情:

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

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

关于javascript - 以express方式发送post请求时超出了最大调用堆栈大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60437973/

相关文章:

javascript - CoffeeScript 中对象内的函数

node.js - Heroku 生产应用程序 : 'Invalid Host Header' with express server and proxy

node.js - 从 AWS Lambda (NodeJS) 发送 SSH 命令

node.js - 从/usr/local/bin/node 卸载 Node

javascript - SailsJS - 动态加载配置而无需重新启动

javascript - 寻找完整的 AJAX cms

javascript - JSON.parse() 保持字符串编码

javascript - nodejs 域实际上如何在多个请求的幕后工作?

javascript - 使用 jQuery Isotope 了解 setTimeout() 和回调

javascript - 使voiceXML读取服务器返回的结果