Максимальный размер стека вызовов превышен при отправке почтового запроса в express - PullRequest
2 голосов
/ 27 февраля 2020

'RangeError: Превышен максимальный размер стека вызовов' при отправке почтового запроса, Node.js, body-parser, express

Я новичок в node.js, я Я столкнулся с проблемой при просмотре видео # 30 из этой серии уроков по node.js и express, и я совершенно не понимаю, почему это происходит.

Я смотрю видео о постах, и в этом руководстве я настроил app.post для страницы '/contact', как показано ниже, но при отправке я получаю сообщение об ошибке, показанное ниже. Если я закомментирую код 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

1 Ответ

1 голос
/ 27 февраля 2020

На этом этапе 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});
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...