【问题标题】:POST Request returns 504 Online but works locallyPOST 请求返回 504 Online 但在本地工作
【发布时间】:2021-03-01 18:55:55
【问题描述】:

简介

我的 POST 请求可以离线工作,即在 localhost 上,但在部署网站时不起作用。

我正在使用 nextjs、node、nodemailer、axios 和 nginx。我也使用了 fetch 而不是 axios,它给了我同样的问题。

情况

我有一个 handleSubmit 函数,它从联系表单中获取一些输入并将其发送到我的 Gmail 帐户:

        axios({
            method: "POST",
            url: "/api/submit",
            data: body,
            headers: {
                'Accept': 'application/json',
                'Content-Type': 'application/json'
            }
        }).then((response) => {
            if (response.data.status === 'success') {
                alert("Email sent, awesome!");
            } else {
                alert("Oops, something went wrong. Try again")
            }
        })

api/submit.js如下:

import nodemailer from "nodemailer"

var transport = {
    service: 'gmail',
    host: "smtp.gmail.com",
    port: 587,
    secure: false,
    auth: {
        user: process.env.USER,
        pass: process.env.PASS
    }
}

var transporter = nodemailer.createTransport(transport);

transporter.verify((error, success) => {
    if (error) {
        console.log("There was an error:" + error);
    } else {
        console.log("Server is ready to take messages")
    }
})

export default async (req, res) => {
    switch (req.method) {
        case "POST":
            var name = req.body.name;
            var content = name " text "
            var mail = {
                from: name,
                to: "myemail@gmail.com",
                text: content
            }
    
            transporter.sendMail(mail, (err, data) => {
                if (!err) {
                    res.json({
                        status: "success"
                    })
                    res.end();
                }
            })
            break
        case "GET":
            res.status(200).json({name:"John Doe"})
            break
        default:
            res.status(405).end()
            break
    }

}

当我运行 npm run dev 或 npm start 时,代码可以在本地运行,它会发布到 http://localhost:3000/api/submit,我会在几秒钟内收到电子邮件。

但是,当我在 DigitalOcean 上部署网站并点击提交按钮时,60 秒内没有任何反应,然后我在 POST 请求中收到状态代码 504。如果我向 api/submit 发送 GET 请求,它可以工作,并且我看到了该请求的 JSON,所以这是 POST 请求的问题。

我的 Nginx 记录如下:

2021/02/27 13:59:35 [error] 95396#95396: *3368 upstream timed out (110: Connection timed out) while reading response header from upstream, client: my.ip, server: website.com, request: "POST /api/submit HTTP/1.1", upstream: "http://127.0.0.1:3000/api/submit", host: "website.com", referrer: "https://website.com/contact"

我已经尝试调试它好几天了,但我就是想不通。 有人有什么想法吗?

EDIT 01.03.2021 尴尬地解决了这个问题。

原来端口都打开了,telnet 对所有邮件端口和 smtp 主机都有效。

当我硬编码用户名/密码时,例如对于临时邮件用户:“blah@emphemeral.email”,通过:“fakepassword”;电子邮件将在生产中发送。

原来我的 process.env.USER 和 process.env.PASS 在 npm run build 期间没有被替换为 .env 中的 process.env.USER/PASS 的值,因为我是克隆我的 GitHub 存储库,其中不包含我的 .env 文件。在服务器上创建我的 .env 文件并运行 npm run build 后,代码运行良好。

感谢您的回复,麻烦您了。

【问题讨论】:

  • 请检查主机 smtp.gmail.com 和端口号 587 是否已从您部署应用程序的数字海洋中打开。

标签: node.js post fetch next.js nodemailer


【解决方案1】:

请从部署您的应用程序的 Digital Ocean 中检查以下主机的端口是否打开。 Host:smtp.gmail.com Port: 587

【讨论】:

    【解决方案2】:

    我猜这不是您的代码的问题,而是部署过程的问题。您是直接向您的 API 地址请求还是传递给代理?如果您使用代理,则代理可能没有以正确的方式重定向到您的应用程序

    【讨论】:

      【解决方案3】:

      我认为,它适用于您的本地计算机,因为 localhost 就在那里。但在服务器上,也许就不一样了。

      您可以通过以下命令检查服务器中的主机名

      cat /etc/hosts
      

      如果主机名不同,可能您也允许使用 CORS。检查的好地方是在您的浏览器中检查(在谷歌浏览器中,右键单击 -> 检查)

      然后检查您是否发现任何与从您的前端访问服务器相关的消息。

      【讨论】:

        【解决方案4】:

        我怀疑我不是第一个这样做的人,但这很尴尬。

        首先,我确认所有端口都是开放的,telnet 对所有邮件端口和 smtp 主机都有效。

        然后,当我硬编码用户名/密码时,例如对于临时邮件用户:“blah@emphemeral.email”,通过:“fakepassword”;该电子邮件将在生产中发送。

        然后我意识到我的 process.env.USER 和 process.env.PASS 变量在 npm run build 期间没有被 .env 中 process.env.USER/PASS 的真实值替换,因为我正在克隆我的 GitHub repo,其中不包含我的 .env 文件。这意味着我试图以 username = "process.env.USER" 和 password = "process.env.PASS" 身份登录。

        在服务器上创建我的 .env 文件并运行 npm run build 后,代码运行良好。

        感谢您的回复,很抱歉给您带来麻烦。

        【讨论】:

          猜你喜欢
          • 2017-04-20
          • 1970-01-01
          • 2023-03-17
          • 2021-08-27
          • 2015-02-14
          • 2017-09-01
          • 1970-01-01
          • 2015-09-22
          • 1970-01-01
          相关资源
          最近更新 更多