**请求的资源上不存在“Access-Control-Allow-Origin”标头。**

时间:2021-02-18 10:45:16

标签: node.js reactjs express axios nodemailer

在本地服务器 nodemailer 发送所有邮件,但在生产中 抛出控制台错误: 请求的资源上不存在“Access-Control-Allow-Origin”标头。

节点后端部署在 heroku 上 + netlify 上的 react 应用

//react app axios post method for sending user data
const sendMail = async() => {
  await axios
    .post("https://xxxxxxx.herokuapp.com/email", {
      username: username,
      senderemail: email,
      subject: subject,
      message: message,
    })
    .then((res) => {
      res.status === 200 ? alert("Message sent!") : alert("Try again!");
    })
    .catch((err) => console.error(err));
};

表达 app.js 文件 这些是我的快速后端代码片段

console error

nodemailer 代码段模块:

const nodemailer = require("nodemailer");
require("dotenv").config();

const transporter = nodemailer.createTransport({
  service: "gmail",
  auth: {
    user: process.env.G_USER,
    pass: process.env.G_PASS,
  },
});

module.exports = transporter;

快速代码片段:

const express = require("express");
const cors = require("cors");
const app = express();
const transporter = require("./mail");
const PORT = process.env.PORT || 5000;

app.use(
  cors({
    origin: "https://xxxxxx.netlify.app",
    optionsSuccessStatus: 200,
  })
);
app.use(express.json());

app.get("/", (req, res) => {
  res.send("node is up!");
});

app.post("/email", async (req, res) => {
  const username = req.body.username;
  const senderemail = req.body.senderemail;
  const subject = req.body.subject;
  const message = req.body.message;

  const mailOptions = {
    from: username,
    to: "xxxxxxx@gmail.com",
    subject: subject,
    html: `
    <p>${message}</p>
    <address>By: ${username} <br/> ${senderemail}<address/>
    `,
  };

  await transporter.sendMail(mailOptions, (err, info) => {
    if (err) {
      console.error(err.message);
    } else {
      res.json(info.response);
    }
  });
});

app.listen(PORT, () => {
  console.log(`Server is up!`);
});

2 个答案:

答案 0 :(得分:0)

我建议您首先尝试通过执行 cors() 来使其正常工作,然后将域列入白名单。如果您仍然无法使其工作,则可以使用以下解决方案。但请不要忘记将域正确列入白名单。

app.use((req, res, next) => {
  res.setHeader('Access-Control-Allow-Origin', '*');
  res.setHeader('Access-Control-Request-Method', '*');
  res.setHeader('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,PATCH');
  res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
  res.setHeader('Access-Control-Expose-Headers', 'Content-Type');

  if(req.method === 'OPTIONS') {
    res.writeHead(200);
    return res.end();
  } else {
    return next();
  }
});

答案 1 :(得分:0)

https://accounts.google.com/DisplayUnlockCaptcha

嘿伙计们,如果您正在使用 nodemailer Gmail 服务并遇到同样的问题,请单击上面的链接以解锁 CAPTCHA.... 因为 gmail 阻止第三方应用程序发送电子邮件...... 通过允许访问我的代码工作正常!!!

相关问题