javascript - jQuery.post() 发送电子邮件,但在没有服务器刷新的情况下无法到达 .done()/.fail()/.always()

标签 javascript jquery express nodemailer

我基本上只是尝试将表单信息发送到电子邮件,而无需刷新页面,我一路走到了这一步。这里的问题是,即使它正确发送电子邮件,它也不会清除表单,因为 $.post() 永远不会到达 .done() 或 .fail() 或 .always()。尽管我注意到当我使用nodemon更改代码并保存它时,它会刷新服务器,然后它会到达.fail()和.always(),但永远不会到达.done()。

你们知道我应该怎么做才能使 $.post() 正确完成/失败/始终吗?

代码如下:

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 是一个简单的“错误请求”,204 是“成功/无内容”。您可以进一步修改这些内容,但目前客户端将收到响应,以便您可以继续。

关于javascript - jQuery.post() 发送电子邮件,但在没有服务器刷新的情况下无法到达 .done()/.fail()/.always(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59184431/

相关文章:

javascript - 脚本 16389 : Unspecified error -- Javascript code

javascript - 单击按钮会出现错误路径错误

javascript - jQuery 和 Express - 混淆了成功和错误

javascript - 附加子项不能在两个圆圈中工作

javascript - 如何获取扩展中文件的完全限定 URL?

Javascript for 循环与 jQuery

java - 多部分文件提交永远不会命中服务器方法

javascript - 如何使 `do while` 循环(它的停止条件)取决于 AJAX 调用的回调?

node.js - 数据库中的 HTML 显示为纯文本

Node.js(Express) REST 服务 POST 方法返回 404