2016-04-26 7 views
0

連絡先フォームに入力する際に​​簡単なWebページを作成しようとしています。未定義のプロパティ 'username'を読み取ることができません - Node.jsの電子メールでフォームデータを送信

私はこのためのNode.jsを使用しようとしていると私はこの次のエラーを取得しています:

これは私がこれまで行って何です。

Cannot read property 'username' of undefined

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 routes = require('./routes/index'); 
var users = require('./routes/users'); 

var app = express(); 

app.post('/contact', function(req,res){ 
    var mailOpts, smtpTrans; 

    smtpTransport = nodemailer.createTransport("SMTP",{ 
    host: "smtp.gmail.com", 
    secureConnection: true, 
    port: 465, 
    auth: { 
     user: "[email protected]", 
     pass: "secret" 
    } 
    }); 

    mailOpts = { 
    from: req.body.username + ' <' + req.body.email + '>', 
    to: '[email protected]', 
    subject: 'Website contact', 
    text: req.body.message 
    }; 


    smtpTrans.sendMail(mailOpts, function(error, info){ 
    if(error){ 
      console.log(error); 
     }else{ 
      console.log("Message sent: " + response.message); 
     } 
    }); 
    console.log(req.body.username + ' <' + req.body.email + '>'); 
}); 

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

// 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: true })); 
app.use(cookieParser()); 
app.use(express.static(path.join(__dirname, 'public'))); 

app.use('/', routes); 
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); 
}); 

// error handlers 

// development error handler 
// will print stacktrace 
if (app.get('env') === 'development') { 
    app.use(function(err, req, res, next) { 
    res.status(err.status || 500); 
    res.render('error', { 
     message: err.message, 
     error: err 
    }); 
    }); 
} 

// production error handler 
// no stacktraces leaked to user 
app.use(function(err, req, res, next) { 
    res.status(err.status || 500); 
    res.render('error', { 
    message: err.message, 
    error: {} 
    }); 
}); 


module.exports = app; 

index.js

var express = require('express'); 
var router = express.Router(); 

/* GET home page. */ 
router.get('/', function(req, res, next) { 
    res.render('index', { title: 'Express' }); 
}); 

router.get('/contact', function(req, res, next){ 
    res.render('contact', {title: 'Cantact'}) 
}); 

module.exports = router; 

contact.jade

extends layout 

block content 
    h1= title 
    p Welcome to #{title} 
    div.content 
    form(action="/contact", name="contactus", id="contactus", method="post") 
     fieldset 
     p 
      label(for="username") Name: 
      br 
      input(name="username", type="text", id="username") 
     p 
      label(for="email") Email: 
      br 
      input(name="email", type="email",id="email") 
     p 
      label(for="message") Message: 
      br 
      textarea(name="message", cols="40", rows="10", id="message") 
     p 
      input(name="submit", type="submit", value="Send", id="submit") 

私はここで何が欠けているのか分かりません。もし誰かがこれを修正する方法を知っているなら、必要な場合はどのような依存性が必要か、私は自分のエラーを修正する必要があるか教えてください。

種類よろしく

+0

どのラインでエラーが発生していますか?私は 'mailOpts = {from:req.body.username + '<' + req.body.email + '>'と疑う。 –

+0

'console.log(req.body)'とそこにあるものを参照してください。 –

+0

はい、私はそうだと思います。私も同じと疑われている –

答えて

3

あなたのルートを定義する前に、セットアップbody-parserする必要があります。

あなた app.post('/contact')ルート上で、あなたの特急アプリの設定を移動し

app.set('views', path.join(__dirname, 'views')); 
app.set('view engine', 'jade'); 
app.use(logger('dev')); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: true })); 
app.use(cookieParser()); 
app.use(express.static(path.join(__dirname, 'public'))); 

app.post('/contact', function(req,res){ 
    //.... 
}); 
+0

クールありがとう、それは動作するようです! –

+0

しかし、電子メールを送信すると、そのページはまだ接続しようとしています。どのようにサービスを停止しますか?私は次のコードを追加しました:smtpTrans.sendMail(mailOpts、function(error、message){ if(error){ console.log(error); } else { console.log( "Message sent"); } }); smtpTrans.close(); –

+0

リクエストが完了したことをクライアントに伝えるためにレスポンスを送る必要があります: 'res.send(200)' – duncanhall

1

あなたがpostを登録した後、あなたはbodyparserを登録します。 app.use行をapp.postの前に移動して、動作すると仮定します。

関連する問題