Как исправить ошибку «ожидание действует только в асинхронной функции» при использовании Nodemailer - PullRequest
0 голосов
/ 28 марта 2019

Я пытаюсь создать форму для связи с нами, используя Nodemailer, следуя инструкциям.Учебное пособие вставляет некоторый код с веб-сайта Nodemailer, но исходный код был обновлен с момента его записи.

Я вставляю последний код с веб-сайта, но получаю следующую ошибку консоли:

let info = await transporter.sendMail (mailOptions)

SyntaxError:await действителен только в асинхронной функции

Ниже приведен мой код 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 ]

4 голосов
/ 28 марта 2019

Это потому, что await действует только внутри функции async.Синтаксис:

async function some() {
  await other
}

Изменить эту строку:

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

на

Примечание async ключевое слово здесь app.post("/send", async (req, res) => {

Узнать больше о async/await

1 голос
/ 28 марта 2019

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})
1 голос
/ 28 марта 2019

Вы не можете использовать await, не сделав функцию асинхронной.Итак, просто поставьте async перед (req, res), как показано ниже.

app.post("/send", async (req, res) => {
     //other stuff will goes here.
     let info = await transporter.sendMail(mailOptions)
});
1 голос
/ 28 марта 2019

transporter.sendMail(mailOptions) - это асинхронные операции, и, следовательно, в примере используется ключевое слово await перед тем, чтобы сделать синхронное выполнение.

Однако ключевое слово await разрешено только в методе, помеченном как async.Так что в вашем случае вам нужно пометить метод 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));
}
);
...