AWS Lambda для чтения файла с использованием NodeJS - PullRequest
0 голосов
/ 02 июля 2019

Я пытаюсь создать лямбда-функцию для отправки электронного письма. Проблема в том, что я не могу получить путь к шаблону электронной почты на Lambda. Ошибка, которую я получил:

"errorMessage": "ENOENT: нет такого файла или каталога, откройте '/var/task/email_template.ejs'"

Вот моя структура проекта и мой код: Project structure

service.js:

export const generateEmail = async (subject, text, email) => {
  try {
    const pathName = process.env.LAMBDA_TASK_ROOT
      ? path.resolve(process.env.LAMBDA_TASK_ROOT, 'email_template.ejs')
      : path.resolve(__dirname, 'email_template.ejs')

    const data = await ejs.renderFile(pathName, {
      name: 'John Doe'
    })

    return {
      from: '"Service" <no-reply.service@ses.com>',
      to: email,
      subject: subject,
      text: text,
      html: data
    }
  } catch (err) {
    throw err
  }
}

sendMail.js

exports.handler = async (event, context, callback) => {
  if (event.httpMethod === 'POST' && event.body) {
    const req = JSON.parse(event.body)
    const { name, email } = req

    if (!email.match(/^[^@]+@[^@]+$/)) {
      console.log('Not sending: invalid email address', body.email)
      return callback(null, {
        statusCode: 400,
        body: JSON.stringify({
          error_code: 'invalid_email',
          message: 'Cannot send. Your email is invalid'
        })
      })
    }

    const config = {
      accessKeyId: process.env.ACCESS_KEY,
      secretAccessKey: process.env.SECRET_KEY
    }

    const transporter = nodemailer.createTransport(ses(config))
    const mailOptions = await generateEmail('Hello ✔', 'Hello world', email)

    try {
      await transporter.sendMail(mailOptions)
      return callback(null, {
        statusCode: 204
      })
    } catch (err) {
      return callback(null, {
        statusCode: 400,
        body: JSON.stringify({
          error_code: 'general_error',
          message: 'Please try again later',
          full_error: err
        })
      })
    }
  }

  return callback(null, {
    statusCode: 400,
    body: JSON.stringify({
      error_code: 'missing_parameters',
      message: 'Please provide your name and email'
    })
  })
}

Функция generateEmail отлично работает локально, но не работает с лямбда-функцией.

Любая помощь будет оценена, спасибо!

1 Ответ

1 голос
/ 02 июля 2019

Я наконец-то нашел ответ сам.Причина в том, что при сборке webpack он игнорирует мой файл email_template.ejs.

Поэтому я добавляю эту строку в мой webpack.config.js, чтобы она существовала на моем zip-выходе, и она отлично работает.

  (...),
  plugins: [
    new CopyWebpackPlugin([{ from: './src/email_template.ejs', to: './src' }])
  ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...