0

I have SPAs. I use nodejs + mongoDb. In the end of my SPAs, I have contact form. When visitor fill the contact form and click submit button. I received an E-mail. Everythings fine until here. But, form not redirect. In the title bar loading indicator always turn. I just want to callback same page.

I try these but its not working.

res.render("/",{Error:"block"}); req.redirect('/');

This my Ejs code Index.ejs

       <form class="cf" method="POST" action="/">
          <div class="half left cf">
            <input type="text" id="input-name" placeholder="Name" name="nameContact">
            <input type="email" id="input-email" placeholder="Email address" name="emailContact">
            <input type="text" id="input-subject" placeholder="Subject" name="subjectContact">
          </div>
          <div class="half right cf">
            <textarea type="text" id="input-message" placeholder="Message" name="messageContact"></textarea>
          </div>  
          <input type="submit" id="input-submit">
        </form>

This my post method.

module.exports = function (app) {

    app.get('/', function (req, res) {
        Resume.find({}, function (err, data) {
            console.log(data)
            if (err) throw err;
            res.render('index', { resumes: data });
        });
    });

    app.post('/', urlencodedParser, function (req, res) {
        console.log(req.body);
        console.log(req.body.nameContact);
        main(req.body.nameContact, req.body.emailContact, req.body.subjectContact, req.body.messageContact)
            .then(() => {
                console.log("Email Sended");            
            }, err => { console.log("Email Error: " + err) })
            .catch(console.error);
    });
};

async function main(nameContact, emailContact, subjectContact, messageContact) {

    // Generate test SMTP service account from ethereal.email
    // Only needed if you don't have a real mail account for testing
    //let testAccount = await nodemailer.createTestAccount();

    // create reusable transporter object using the default SMTP transport
    let transporter = nodemailer.createTransport({
        host: "smtp.office365.com",
        port: 587,
        secure: false, // true for 465, false for other ports
        auth: {
            user: contactFormController.CONTACT_USER, // generated ethereal user
            pass: contactFormController.CONTACT_PASS // generated ethereal password
        }
    });

    // send mail with defined transport object
    let info = await transporter.sendMail({
        from: contactFormController.CONTACT_USER,
        replyTo: '<"' + emailContact + '">', // sender address
        to: "email", // list of receivers
        subject: subjectContact, // Subject line
        text: messageContact, // plain text body
        html: "<b>'" + messageContact + "'</b>" // html body
    });

    console.log("Message sent: %s", info.messageId);
    // Message sent: <b658f8ca-6296-ccf4-8306-87d57a0b4321@example.com>

    // Preview only available when sending through an Ethereal account
    console.log("Preview URL: %s", nodemailer.getTestMessageUrl(info));
    // Preview URL: https://ethereal.email/message/WaQKMgKddxQDoou...
}

Oğuz Özdemir
  • 89
  • 3
  • 12

1 Answers1

1

Looks like you're using express. In express redirect method is available to response object not the request object. express docs here

Usage is response.redirect('/path')

Also you cannot do both render and redirect (headers can be sent only once):

res.render("/",{Error:"block"});
res.redirect('/');
1565986223
  • 6,420
  • 2
  • 20
  • 33