Javascript 我遇到了一个错误&x27;发送后无法设置标题';无论node.js上出现什么,电子邮件上的错误消息都会不断出现

Javascript 我遇到了一个错误&x27;发送后无法设置标题';无论node.js上出现什么,电子邮件上的错误消息都会不断出现,javascript,node.js,express,Javascript,Node.js,Express,目录如下:父文件夹“联系人表单”有一个子目录“src”,其中包含“server.js”和“routes.js”文件,还包含另一个文件夹“views”,其中包含“Contact.ejs”和“index.ejs”文件 这是“server.js”上的代码 const path = require('path'); const express = require('express'); const layout = require('express-layout'); const bodyParser

目录如下:父文件夹“联系人表单”有一个子目录“src”,其中包含“server.js”和“routes.js”文件,还包含另一个文件夹“views”,其中包含“Contact.ejs”和“index.ejs”文件

这是“server.js”上的代码

const path = require('path');
const express = require('express');
const layout = require('express-layout');
const bodyParser = require('body-parser');
const validator = require('express-validator');
const cookieParser = require('cookie-parser');
const session = require('express-session');
const flash = require('express-flash');

const routes = require('./routes');
const app = express();

app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

const middlewares = [
  validator(),
  layout(),
  express.static(path.join(__dirname, 'public')),
  bodyParser.urlencoded(),
  cookieParser(),
  session({
    secret: 'super-secret-key',
    key: 'super-secret-cookie',
    resave: false,
    saveUninitialized: false,
    cookie: {maxage: 6000}
 }),
 flash()
]

app.use(middlewares);

app.use('/', routes);

app.use((req, res, next) => {
  res.status(404).send("Sorry can't find that!")
});

app.use((err, req, res, next) => {
  console.error(err.stack)
  res.status(500).send('Something broke!')
});

app.listen(3000, () => {
  console.log(`App running at http://localhost:3000`)
});
然后在“routes.js”上

 const express = require('express');
 const router = express.Router();
 const { check, validationResult } = require('express-validator/check');
 const { matchedData } = require('express-validator/filter');

 router.get('/', (req, res) => {
   res.render('index')
 });

 router.get('/contact', (req,res) => {
   res.render('contact', {
   data: {},
   errors: {}
  });
 });

 router.post('/contact', [
 //validation using 'express-validaor' && 'express-validator/check' and 
 //Sanitization using
 // 'express-validator/filter'
   check('message')
    .isLength({ min:1 })
    .withMessage('Message is required')
    .trim(),
   check('email')
    .isEmail().withMessage('That Email doesn\'t look right')
    .trim()
    .normalizeEmail()
  ], (req,res) => {
  const errors = validationResult(req);
  res.render('contact', {
    data: req.body,
    errors: errors.mapped()
   });

   const data = matchedData(req);
   console.log('Sanitized: ', data);

  //Sending sanitized data and redirecting to the index page
   req.flash('success', 'Thanks for the message! I\'ll be in touch :) ');
   res.redirect('/');
 });
 module.exports = router;
关于“contact.ejs”

<div class="form-header">
   <% if(Object.keys(errors).length === 0) { %>
    <h2>Send us a Message</h2>
   <% } else { %>
      <h2 class="error-heading">Oops, please correct the following:</h2>
      <ul class="erroe-list">
          <% Object.values(errors).forEach(error => { %>
              <li> <%= error.msg %> </li>
       <%  }) %>
      </ul>
   <% } %>
</div>
<form method="POST" action="/contact" novalidate>
  <div class="form-field <%= errors.message ? 'form-field-invalid' : '' %>">
      <label for="message">Message</label>
       <textarea class="input" id="message" name="message" rows="4" 
      autofocus >
      <%= data.message %> </textarea>
      <% if (errors.message) { %>
          <div class="error"><%= errors.message.msg %></div>
       <% } %>
   </div>
   <div class="form-field <%= errors.email ? 'form-field-invalid' : '' %>">
      <label for="email">Email</label>
      <input class="input" id="email" type="email" value="<%= data.email %>" 
   />
     <% if (errors.email) { %>
          <div class="error"><%= errors.email.msg %></div>
     <% } %>
   </div>
   <div class="form-actions">
      <button class="btn" type="submit" >Send</button>
   </div>
</form>

给我们发个信
哦,请更正以下内容:
    { %>
消息 电子邮件 发送
在'index.ejs'上

 <h1>Working With Forms in Node.js</h1>
在Node.js中使用表单

发送标题后无法发送标题。
的通用消息是:您已经发送了响应。。您同时呈现页面和重定向,这没有任何意义

因此,要么:

res.render('contact', {
    data: req.body,
    errors: errors.mapped()
 });


如果只想在出错时
渲染
,在成功时
重定向
,请执行以下操作:

const errors = validationResult(req);

if (!errors.isEmpty()) {
    // Notice the return, so redirect won't run.
    return res.render('contact', {
        data: req.body,
        errors: errors.mapped()
    });
}

const data = matchedData(req);
console.log('Sanitized: ', data);

//Sending sanitized data and redirecting to the index page
req.flash('success', 'Thanks for the message! I\'ll be in touch :) ');
res.redirect('/');
关于电子邮件错误,您缺少电子邮件
输入
上的
名称
属性,没有它,将不会发布任何内容

<input class="input" name="email" id="email" type="email" value="<%= data.email %>" 
   />



查看以下问题以了解更多信息:

在router.post(“/contact”)中,如果下面有一个render()和一个redirect(),这将产生错误。

我相信这是由于执行
res.render()
res.redirect()导致的
好的。无论我在电子邮件输入框中输入了什么,你都能检查我收到的电子邮件错误吗?是的..就是那个错误..即使我输入了有效的电子邮件,它也会给我那个错误。更新了我的答案,它实际上是:
如果(!errors.isEmpty()){
,您在电子邮件输入中缺少了
名称
属性。我以前尝试过这样做,但o做不到,我刚得到16分,我当时是11分,它说它已经记录了我的投票,但不会改变投票结果。
<input class="input" name="email" id="email" type="email" value="<%= data.email %>" 
   />