6

所以我想说我一直在寻找这个问题的答案,我也尝试过 console.log 我的 req.body 发布表单,但我一直不确定。所以我觉得我从我发送的表格中丢失了数据,我不确定我做错了什么。所以是时候展示一些代码了。

注意:我正在使用 Handlebars 进行快速设置。

应用程序.js

var express    = require('express'),
    exphbr     = require('express3-handlebars'), // "express3-handlebars"
    nodemailer = require('nodemailer'),
    helpers    = require('./lib/helpers'),

    app = express(), handlebars;

// Create `ExpressHandlebars` instance with a default layout.
handlebars = exphbr.create({
    defaultLayout: 'main',
    helpers      : helpers,
    extname      : '.html',

    // Uses multiple partials dirs, templates in "shared/templates/" are shared
    // with the client-side of the app (see below).
    partialsDir: [
        'views/shared/',
        'views/partials/'
    ]
});

// Register `hbs` as our view engine using its bound `engine()` function.
app.engine('html', handlebars.engine);
app.set('view engine', 'html');

require("./routes")(app, express, nodemailer);

app.listen(3000);

路由.js

module.exports = function (app, express, nodemailer) {

    // set up the routes themselves
    app.get('/', function (req, res) {
        res.render('home', {
            title: 'Larry King Orchestra'
        });
    });

    // I cut out a majority of my routes to make this easier to read.

    // SEND EMAIL FROM FORM
    app.post('/', function (req, res) {
        console.log("WTF");
        console.log(req.body.name);
        console.log(req.body.email);

        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: "email@gmail.com",
                pass: "password" 
            }
        });

        //Mail options
        mailOpts = {
            from: req.body.email, //grab form data from the request body object
            to: 'anotheremail@gmail.com',
            subject: 'LKO Contact Form',
            html: 'From: ' + req.body.name + ' &lt;' + req.body.email + '&gt; <br>Phone: ' + req.body.tel + '<br>Date of Event: ' + req.body.date + '<br>Location: ' +  req.body.location + '<br>Details &amp; Comments:<br>' + req.body.message + '<br><br><p>Email form provided by <a href="http://www.wavamedia.com/">WavaMedia</a>.'
        };

        smtpTrans.sendMail(mailOpts, function (error, response) {
            //Email not sent
            if (error) {
                res.render('home', { 
                    title: 'Larry King Orchestra', 
                    msg: 'Error occured, message not sent.', 
                    err: true, 
                    page: 'home' 
                });
            }
            //Yay!! Email sent
            else {
                res.render('home', { 
                    title: 'Larry King Orchestra', 
                    msg: 'Message sent! Thank you.', 
                    err: false, 
                    page: 'home'
                });
            }
        });
    });

    // STATIC ROUTE FOR ASSESTS
    app.use(express.static('assests/'));
};

我将车把扩展名重命名为 .html,并且我的主布局使用了局部。所以 app.get('/') 会将下一个文件显示为部分文件,并将其呈现在页面上。

联系人.html

<form class="contact" action="/" method="post">
    <label for="name">Name</label>
    <input type="name" name="name" id="name">

    <label for="email">Your Email (required)</label>
    <input type="email" name="email" id="email">

    <label for="tel">Phone Number</label>
    <input type="tel" name="tel" id="tel">

    <label for="date">Date of Your Event</label>
    <input type="date" name="date" id="date">

    <label for="location">Venue/Location</label>
    <input type="location" name="location" id="location">

    <label for-"message">Details &amp; Comments</label>
    <textarea name="message" id="message" rows="3"></textarea>

    <input type="submit" name="submit" id="submit" value="Send" class="btn btn-default">
</form>

我的错误:

TypeError: Cannot read property 'name' of undefined at c:\xampp\htdocs\lko\routes.js:129:26 at callbacks (c:\xampp\htdocs\lko\node_modules\express\lib\router\index.js:164:37) at param (c:\xampp\htdocs\lko\node_modules\express\lib\router\index.js:138:11) at pass (c:\xampp\htdocs\lko\node_modules\express\lib\router\index.js:145:5) at Router._dispatch (c:\xampp\htdocs\lko\node_modules\express\lib\router\index.js:173:5) at Object.router (c:\xampp\htdocs\lko\node_modules\express\lib\router\index.js:33:10) at next (c:\xampp\htdocs\lko\node_modules\express\node_modules\connect\lib\proto.js:193:15) at Object.expressInit [as handle] (c:\xampp\htdocs\lko\node_modules\express\lib\middleware.js:30:5) at next (c:\xampp\htdocs\lko\node_modules\express\node_modules\connect\lib\proto.js:193:15) at Object.query [as handle] (c:\xampp\htdocs\lko\node_modules\express\node_modules\connect\lib\middleware\query.js:45:5)

所以我不确定我的代码哪里出错了。我相信表单正在向我的节点应用程序发送数据,但我不确定它的去向。我已经设置了 post 方法,但到目前为止没有运气:( 我已经尝试了几天。我也安装了 nodemailer。我已经重新启动了服务器,更新了 node 和 npm。

JavaScript Node Guru Masters,只有你能给我带来光明!感谢您阅读所有这些内容,非常棒!

4

4 回答 4

10
app.use(express.bodyParser());

将其添加到您的 app.js 中,这就是从发布数据表单中获取信息的内容。

于 2014-03-19T19:02:17.157 回答
6

您必须为此需要正文解析器包。
首先,您必须使用 npm 安装它。

$ npm install --save body-parser

然后在你的js文件中要求它。

var bodyParser = require('body-parser');

然后添加解析器。当您使用 html post 方法时,它urlencoded用作编码类型。为此添加这一行。

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

(如果你使用 json 你必须使用bodyParser.json()而不是这个)
现在将具有编码类型的解析器添加到app.post方法中,如下所示。

app.post('/',urlencodedParser, function (req, res) {
    //your code here
});
于 2016-08-06T16:36:43.810 回答
3

您不必明确提及任何 bodyParser 或 bodyParer.json

相反,您可以简化使用它,因为这是 Express 中的内置中间件功能。

app.use(express.json());
于 2020-09-11T14:07:15.170 回答
0
app.use(bodyparser.urlencoded({extended : true })); 
于 2020-10-25T03:24:58.317 回答