#javascript #node.js #nodemailer
#javascript #node.js #nodemailer
Вопрос:
Привет, я пытаюсь использовать nodemailer с gmail для создания контактной формы на моем веб-сайте, однако я считаю, что существует проблема с маршрутизацией, которая вызывает отправку почты, но я не могу ее исправить.
Мой about.html страница содержит приведенную ниже форму кода:
<form id="contact" action="/contact" id="contact-form" method="post" role="form">
<h3>Contact Form</h3>
<fieldset>
<input placeholder="Your name" type="text" tabindex="1" id="name" name="name" required autofocus>
</fieldset>
<fieldset>
<input placeholder="Subject" type="text" tabindex="1" id="subject" name="subject" required>
</fieldset>
<fieldset>
<input placeholder="Your Email Address" type="email" tabindex="2" id="email" name="email" required>
</fieldset>
<fieldset>
<textarea placeholder="Type your message here...." tabindex="5" id="message" name="message" required></textarea>
</fieldset>
<fieldset>
<button name="submit" type="submit" id="contact-submit" data-submit="...Sending">Submit</button>
</fieldset>
</form>
И мой app.js файл, который является узловым сервером, содержит код
//safe enviroment variables
require('dotenv').config();
//express routing
var express = require("express");
var app = express();
var router = express.Router();
var path = __dirname '/views/';
app.use(express.static('public'));
router.use(function (req,res,next) {
console.log("/" req.method);
next();
});
router.get("/",function(req,res){
res.sendFile(path "index.html");
});
router.get("/about",function(req,res){
res.sendFile(path "about.html");
});
app.use("/",router);
app.use("*",function(req,res){
res.sendFile(path "404.html");
});
app.listen(8080, function () {
console.log('Example app listening on port 8080!')
})
//nodemail
const nodemailer = require('nodemailer')
const bodyParser = require('body-parser')
app.use(bodyParser.urlencoded({extended: true}))
//collecting gmail username and password
const GMAIL_USER = process.env.GMAIL_USER
const GMAIL_PASS = process.env.GMAIL_PASS
// POST route from contact form
app.post("/contact", (req, res) => {
async function main() {
// Instantiate the SMTP server
const smtpTrans = nodemailer.createTransport({
service: 'Gmail',
host: 'smtp.gmail.com',
port: 465,
secure: true,
auth: {
user: GMAIL_USER,
pass: GMAIL_PASS
}
})
// Specify what the email will look like
const mailOpts = {
from: GMAIL_USER , // This is ignored by Gmail
to: GMAIL_USER,
subject: `${req.body.subject}`,
text: `${req.body.name} (${req.body.email}) says: ${req.body.message}`
}
// Attempt to send the email
smtpTrans.sendMail(mailOpts, (error, response) => {
if (error) {
console.log('error email')
res.sendFile(path "index.html"); // Show a page indicating failure
}
else {
console.log('email sent')
res.sendFile(path "about.html"); // Show a page indicating success
}
})
}
})
Однако при нажатии кнопки отправки формы она отправляет меня на страницу 404, указывая, что форма не может найти функцию post, поскольку, если бы она могла, она не перенаправила бы меня на функцию post. Я также добавил эхо-сигналы в функцию для печати на консоль, если она вызывается, чего не происходит. Я попытался изменить маршрутизацию, но, похоже, не могу заставить ее работать.
Комментарии:
1. Вам нужно перейти
app.listen()
к концу, ниже всех ваших маршрутов.2. Спасибо, Крис, я попробовал это, но это не решило проблему
3. Вам также необходимо переместить
app.use("*", ...)
маршрут вниз, иначе он перехватит/contact