使用Nodemailer时如何解决“等待仅在异步功能中有效”错误

时间:2019-03-28 11:44:39

标签: node.js angular nodemailer

我正在通过遵循教程来尝试使用Nodemailer创建联系我们表单。本教程从Nodemailer网站粘贴了一些代码,但是自从记录该教程以来,源代码已经更新。

我从网站上粘贴了最新代码,但出现以下控制台错误:

  

让信息=等待transporter.sendMail(mailOptions)

     

SyntaxError:等待仅在异步功能中有效

下面是我的app.js代码:

const express = require("express");
const bodyParser = require("body-parser");
const exphbs = require("express-handlebars");
const path = require("path");
const nodemailer = require("nodemailer");

const app = express();

// View engine setup
app.engine("handlebars", exphbs());
app.set("view engine", "handlebars");

// Static folder
app.use("/public", express.static(path.join(__dirname, "public")));

// Body Parser Middleware
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

app.get("/", (req, res) => {
  res.render("contact");
});

app.post("/send", (req, res) => {
  const output = `
    <p>You have a new contact request</p>
    <h3>Contact Details</h3>
    <ul>
        <li>Name: ${req.body.name}</li>
        <li>Company: ${req.body.company}</li>
        <li>Email: ${req.body.email}</li>
        <li>Phone: ${req.body.phone}</li>
    </ul>
    <h3>Message</h3>
    <p>${req.body.message}</p>    
    `;

    var transporter = nodemailer.createTransport({
        service: 'gmail',
        auth: {
               user: 'youremail@address.com',
               pass: 'yourpassword'
           }
       });

       const mailOptions = {
        from: 'sender@email.com', // sender address
        to: 'to@email.com', // list of receivers
        subject: 'Subject of your email', // Subject line
        html: '<p>Your html here</p>'// plain text body
      };

      let info = await transporter.sendMail(mailOptions)

  console.log("Message sent: %s", info.messageId);
  console.log("Preview URL: %s", nodemailer.getTestMessageUrl(info));

});

app.listen(3000, () => console.log("Server started..."));

我要粘贴的代码位于此页面上:https://nodemailer.com/about/

为什么会出现此错误,我需要进行哪些更改以使代码按预期工作?

4 个答案:

答案 0 :(得分:4)

这是因为await仅在async函数内部有效。语法是

async function some() {
  await other
}

更改此行:

app.post("/send", (req, res) => {

请注意此处的async关键字 app.post("/send", async (req, res) => {

详细了解async/await

答案 1 :(得分:1)

transporter.sendMail(mailOptions)是异步操作,因此该示例在使用await关键字之前使执行同步。

但是,仅在标记为async的方法中允许使用await关键字。因此,在您的情况下,您需要将createTransport方法标记为异步。

例如: async nodemail.createTransport的另一种选择是从方法中重新调整transport.sendMail()并解决承诺。

例如:

var transporter = nodemailer.createTransport({
        service: 'gmail',
        auth: {
               user: 'youremail@address.com',
               pass: 'yourpassword'
           }
       });

       const mailOptions = {
        from: 'sender@email.com', // sender address
        to: 'to@email.com', // list of receivers
        subject: 'Subject of your email', // Subject line
        html: '<p>Your html here</p>'// plain text body
      };

      return transporter.sendMail(mailOptions)

});

transport.then(
result =>   {
  console.log("Message sent: %s", result.info.messageId);
  console.log("Preview URL: %s", nodemailer.getTestMessageUrl(result.info));
}
);

答案 2 :(得分:1)

不使函数异步就不能使用await。因此,只需在(req, res)之前放置异步,如下所示。

app.post("/send", async (req, res) => {
     //other stuff will goes here.
     let info = await transporter.sendMail(mailOptions)
});

答案 3 :(得分:1)

await仅可用于async功能。

请注意,async函数仅用于使承诺以更舒适的方式工作。

因此只需添加async app.post("/send", async (req, res) =>或从其中删除let info = await

`let info = await transporter.sendMail(mailOptions) 

,而是像这样使用then

transporter.sendMail(mailOptions).then((info) => { your code})