node.jsherokunodemailerhttp-status-code-503

Sending email successfully. But got 503 statuscode. Heroku, NodeJS, Nodemailer


I Have issue with sending email from my react app. I have BE in nodeJS deployed on HEROKU. For sending emails I'm using Nodemailer. The point is that everything works fine. Email is sent and deliver. But I don't know why I'm getting 503 status code.

I read heroku documantation where it says that the reason why is that can be infinite loop. But I think I don't have infinity loops here.

Thank you for any kind of help.

Here is my code:

const express = require("express");
const nodemailer = require("nodemailer");
const cors = require("cors");
const bodyParser = require("body-parser");

const app = express();
app.use(cors());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

app.post("/send", async (req, res) => {
  console.log("req: ", req.body);
  const output = `
    <p>You have a new contact request</p>
    <h3>Contact Details</h3>
    <ul>  
      <li>Name: ${req.body.firstName}</li>
      <li>Email: ${req.body.email}</li>
      <li>Phone: ${req.body.phoneNumber}</li>
      <li>Created: ${req.body.createdAt}</li>
    </ul>
    <h3>Message</h3>
    <p>Hi there</p>
  `;
  
  let transporter = nodemailer.createTransport({
    host: process.env.MAIL_HOST,
    port: process.env.MAIL_PORT,
    secure: true, // true for 465, false for other ports
    auth: {
      user: process.env.MAIL_USER, 
      pass: process.env.MAIL_PASSWORD, 
    },
  });

  // send mail with defined transport object
  try {
    await transporter.sendMail({
      from: "test@test.sk", 
      to: "info@test.sk", 
      subject: "Hello ✔", 
      text: "Hello world?", 
      html: output, 
    });
    console.log("Objednávka bola úspešne odoslaná");
    return res;
  } catch (error) {
    console.log("error: ", error);
    return error;
  }
});

const port = process.env.PORT || 3001;

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

Solution

  • You're not sending back any response from your POST handler, you're either returning res or error, both of which don't do anything in Express, which means requests will never properly end.

    Instead, send back a proper response to end the request:

    return res.end();             // for a normal situation
    return res.status(400).end(); // for an error situation
    

    It's up to you if you want to send back some text, or to set another status code that's more appropriate in your app.