【问题标题】:Contact us form Node Js/express 404 error通过 Node Js/express 404 错误联系我们
【发布时间】:2018-09-15 18:47:43
【问题描述】:

我正在尝试创建一个允许某人向我发送电子邮件的表单。 但是,我收到 404 错误,如下所示。 表单本身正在渲染,所以我在 index.js 中的内容正在工作。 我是否需要在其他地方添加一些额外的代码,或者我是否缺少一些额外的代码。 我也安装了 nodemailer 等以及所有必要的软件包。 我对此很陌生,我将不胜感激。 谢谢!

404 error

app.js

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var nodemailer = require('nodemailer');
var index = require('./routes/index');
var users = require('./routes/users');
var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'hbs');


// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', index);
app.use('/users', users);


// catch 404 and forward to error handler
app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
});

app.post('/contactus', function (req, res) {
      var mailOpts, smtpTrans;
      //Setup Nodemailer transport, I chose gmail. Create an application-specific password to avoid problems.
      smtpTrans = nodemailer.createTransport('SMTP', {
        service: 'Gmail',
        auth: {
          user: "me@gmail.com",
          pass: "xxxxxx"
        }
      });
      //Mail options
      mailOpts = {
        from: req.body.name + req.body.email,
        to: 'yyyyyyyyyy@gmail.com',
        subject: req.body.email + '  --Msg from contactus-form',
        text: "Name: " + req.body.name + "Email: "  + req.body.email + 
              "Contact No:  " + req.body.contactNo + "QUERY: " + req.body.message
      };
      smtpTrans.sendMail(mailOpts, function (error, response) {
        //Alert on event of message sent succeeds or fail.
        if (error) {
          res.render('contactus',{msg : 'Error occured, message not sent.', err : true});
        }
        else {
          res.render('contactus',{msg : 'Message sent! Thank you.', err : false});
        }
        smtpTrans.close();
      });
});
// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});


module.exports = app;

contactus.hbs

<html>
  <head>
    <title></title>
    <link rel="stylesheet" href="/stylesheets/style.css">
  </head>
  <body>
    <div class="content">
      <form action="/contactus" method="post">
        <fieldset>
          <p>
            <input type="text" name="name" size="30" required="" placeholder="Name:">
          </p>
          <p>
            <input type="text" name="contactNo" size="30" placeholder="Contact No.:">
          </p>
          <p>
            <input type="text" name="email" size="30" required="" placeholder="Email:">
          </p>
          <p><br>
            <textarea type="text" name="message" cols="37" rows="7" size="30" placeholder="Your message please"></textarea>
          </p>
          <p>
            <input name="submit" type="submit" value="Send" id="submit">
          </p><br>
        </fieldset>
      </form>
    </div>
  </body>
</html>

【问题讨论】:

  • 我的意思是.. 404 排在第一位。 Express 中间件/路由按使用的顺序运行。

标签: html node.js forms express


【解决方案1】:

这个处理程序:

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
});

应移至 500 错误处理程序之前。

原因,它充当了一个包罗万象的角色。这意味着如果之前的某些东西没有首先路由某个地方,它将始终执行。所以它会在有机会到达contactus 路由之前运行并发送 404。

【讨论】:

  • 非常感谢,这确实有道理!
  • 如果它满足您的需要,习惯上会接受答案。谢谢!
  • 你知道这是什么意思吗?对不起ibb.co/nLLfWc
  • 为什么投反对票?是什么原因?如何改进答案?
  • @John - 您没有正确使用nodemailer.createTransport()。看来createTransport() 方法需要一个配置对象作为第一个参数,而不是你拥有的字符串。请查看该库的文档。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-29
  • 2019-10-22
  • 2012-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-07
相关资源
最近更新 更多