jQuery.post() 发送电子邮件但在没有服务器刷新的情况下不会到达 .done()/.fail()/.always()
jQuery.post() send email but doesn't gets to .done()/.fail()/.always() without server refresh
我基本上只是尝试将表单信息发送到电子邮件,而无需刷新页面,我一路走到了这一步。这里的问题是,即使它正确发送了电子邮件,它也不会清除表单,因为 $.post() 永远不会到达 .done() 或 .fail() 或 .always() .虽然我注意到当我更改代码并保存它时使用 nodemon,它刷新服务器然后它到达 .fail() 和 .always() 但永远不会到 .done()。
你们知道我应该怎么做才能使 $.post() 正确地到达 done/fail/always 吗?
代码如下所示:
HTML
<form class="trial-form" action="/trial-submission" method="post">
<input id="company" type="text" name="company" placeholder="Company" />
<input id="person" type="text" name="person" placeholder="Contact person" />
<input id="phone" type="tel" name="telephone" placeholder="Phone" />
<input id="email" type="email" name="mailAddress" placeholder="E-mail" />
<input id="note" type="text" name="note" placeholder="Note" />
<button class="blue-button" id="submit-trial" type="button">send</button>
</form>
JavaScript
$(document).ready(function(){
$("#submit-trial").click(function(event){
let cmpn = $("#company").val();
let eml = $("#email").val();
let phn = $("#phone").val();
let nt = $("#note").val();
let prsn = $("#person").val();
$.post("/trial-submission", {
company: cmpn,
person: prsn,
phone: phn,
email: eml,
note: nt
})
.done(function(){
$("#company").val("");
$("#email").val("");
$("#phone").val("");
$("#note").val("");
$("#person").val("");
alert("success");
})
.fail(function(){
alert("error");
})
.always(function(){
alert("finished");
});
});
});
节点内容在这里
app.post("/trial-submission", function(req, res){
const data = req.body;
let transporter = nodemailer.createTransport({
service: "mail",
auth: {
user: "send@mail.com",
pass: "password"
}
});
let mailOptions = {
from:'send@mail.com',
to:'receive@mail.com',
subject: 'testing',
html:`
Company: ${data.company}<br>
Contact person: ${data.person}<br>
Phone: ${data.phone}<br>
E-mail: ${data.email}<br>
Note: ${data.note}
`
};
transporter.sendMail(mailOptions, function(err, data){
if(err){
console.log('Error Occurs', err);
} else {
console.log('Email Sent!');
}
});
});
您需要在 sendMail 调用中发送响应,否则您的浏览器将永远不会收到任何信息。试试这个:
transporter.sendMail(mailOptions, function(err, data){
if(err){
console.log('Error Occurs', err);
res.sendStatus(400);
} else {
console.log('Email Sent!');
res.sendStatus(204);
}
});
400是简单的"Bad Request",204是"Success/No Content"。您可以进一步修改这些,但目前客户端会收到响应,因此您可以继续。
我基本上只是尝试将表单信息发送到电子邮件,而无需刷新页面,我一路走到了这一步。这里的问题是,即使它正确发送了电子邮件,它也不会清除表单,因为 $.post() 永远不会到达 .done() 或 .fail() 或 .always() .虽然我注意到当我更改代码并保存它时使用 nodemon,它刷新服务器然后它到达 .fail() 和 .always() 但永远不会到 .done()。
你们知道我应该怎么做才能使 $.post() 正确地到达 done/fail/always 吗?
代码如下所示:
HTML
<form class="trial-form" action="/trial-submission" method="post">
<input id="company" type="text" name="company" placeholder="Company" />
<input id="person" type="text" name="person" placeholder="Contact person" />
<input id="phone" type="tel" name="telephone" placeholder="Phone" />
<input id="email" type="email" name="mailAddress" placeholder="E-mail" />
<input id="note" type="text" name="note" placeholder="Note" />
<button class="blue-button" id="submit-trial" type="button">send</button>
</form>
JavaScript
$(document).ready(function(){
$("#submit-trial").click(function(event){
let cmpn = $("#company").val();
let eml = $("#email").val();
let phn = $("#phone").val();
let nt = $("#note").val();
let prsn = $("#person").val();
$.post("/trial-submission", {
company: cmpn,
person: prsn,
phone: phn,
email: eml,
note: nt
})
.done(function(){
$("#company").val("");
$("#email").val("");
$("#phone").val("");
$("#note").val("");
$("#person").val("");
alert("success");
})
.fail(function(){
alert("error");
})
.always(function(){
alert("finished");
});
});
});
节点内容在这里
app.post("/trial-submission", function(req, res){
const data = req.body;
let transporter = nodemailer.createTransport({
service: "mail",
auth: {
user: "send@mail.com",
pass: "password"
}
});
let mailOptions = {
from:'send@mail.com',
to:'receive@mail.com',
subject: 'testing',
html:`
Company: ${data.company}<br>
Contact person: ${data.person}<br>
Phone: ${data.phone}<br>
E-mail: ${data.email}<br>
Note: ${data.note}
`
};
transporter.sendMail(mailOptions, function(err, data){
if(err){
console.log('Error Occurs', err);
} else {
console.log('Email Sent!');
}
});
});
您需要在 sendMail 调用中发送响应,否则您的浏览器将永远不会收到任何信息。试试这个:
transporter.sendMail(mailOptions, function(err, data){
if(err){
console.log('Error Occurs', err);
res.sendStatus(400);
} else {
console.log('Email Sent!');
res.sendStatus(204);
}
});
400是简单的"Bad Request",204是"Success/No Content"。您可以进一步修改这些,但目前客户端会收到响应,因此您可以继续。