【问题标题】:How to make a Heroku app load server.js file如何让 Heroku 应用程序加载 server.js 文件
【发布时间】:2020-07-27 02:45:30
【问题描述】:

我有一个 MERN 堆栈部署到 heroku,在我的应用程序中我有一个联系表单,可以向我发送电子邮件。这自然会使用发布请求和后端设置。我认为 heroku 会启动我的后端服务器,因为我的应用程序上唯一的 dyno 是应该启动服务器的“npm start”。但是,该服务器仅设置为在我选择的任何端口上在我的本地主机上运行,​​所以我想它不起作用是有道理的。我不太确定所有这些东西是如何工作的。我确实知道当我在我的计算机上加载并运行服务器时一切正常,但是当我关闭该服务器时,我的 heroku 应用程序将无法再访问后端。我的设置方式有问题吗?我几乎复制了示例代码,所以我不确定我是否做错了什么,或者我是否真的希望这个服务器在 localhost:PORT 上运行永恒。

任何帮助将不胜感激。谢谢!

编辑:我想我看到了错误,但我不确定如何修复它。我用这一行发送 post 请求:

axios.post( "http://localhost:5000/sendEmail" || "http://ethanmeitz.com/sendEmail"   , data)
        .then(res => console.log(res.data))
        .then((response) => {
            if(response.statusText === "OK" && response.status >= 200 && response.status < 300) {
                return response.json()
            } else {
                throw new Error("Server can't be reached!")
            }
        })
        .then((json) => {
            console.log("It is JSON")
         })
        .catch(err => console.log('Could not send email: ' + err));
      }

但如果 heroku 更改端口,这将不起作用。鉴于 heroku 可能会更改端口并且环境变量仅在后端有效,我应该将发布请求发送到的 URL 是什么。

我尝试将帖子请求更改为:

  axios.post( "http://localhost:5000/sendEmail" || "/sendEmail"   , data)

希望当我在端口 5000 上使用本地主机以及在相对路径有效时在我的网站上使用此功能。相反,它只是尝试发送第一个发布请求,即使认为服务器没有运行。我的使用方式有问题吗||这里?尝试同时发送一个帖子请求会是一个错误的解决方案吗??

【问题讨论】:

    标签: javascript heroku server backend host


    【解决方案1】:

    对于heroku,我认为您必须从环境变量PORT 中获取端口。在你的程序中更改一个寻找端口的like,

    var port = process.env.PORT || 8080;
    

    这将使用 heroku 的当前端口并在本地运行 8080 并将您的 url 更改为 /sendEmail|| 语句不能像逻辑 OR 那样工作。把url用相对的方式说出来

    axios.post( "/sendEmail", data)
            .then(res => console.log(res.data))
            .then((response) => {
                if(response.statusText === "OK" && response.status >= 200 && response.status < 300) {
                    return response.json()
                } else {
                    throw new Error("Server can't be reached!")
                }
            })
            .then((json) => {
                console.log("It is JSON")
             })
            .catch(err => console.log('Could not send email: ' + err));
          }
    

    【讨论】:

    • 我的代码中有这一行,但我从来没有费心将环境变量 PORT 设置为任何值,因为我认为它只会默认为 8080。你是说我需要设置这个变量吗?或者仅仅是这条线的存在应该使它起作用?
    • 如果您不想在另一个端口上启动,则无需添加此行,但在 heroky 上运行时,您应该添加此行,因为 heroku 可能会在不同的端口上运行您的应用程序。如果不是端口问题,我建议您查看日志。首先,您的设置如何,前端和后端在同一台服务器中?你能显示更多的代码吗?
    • 啊,我想我可能会看到一个问题。当我从前端发送 post 请求时,我使用 URL:localhost:PORT/sendEmail 或实际网站的 URL (websiteURL/sendEmail)。鉴于端口可能不同,发送 post 请求的正确 URL 是什么?
    • 此外,为了安全起见,我还检查了日志,它确实启动了服务器,所以这一切都很好,就像你建议它在一个完全随机的端口上,比如 40000 什么的。
    • 是的。更改网页请求中的 URL。那就是问题所在。如果前端和后端都在同一台服务器上运行,只需设置一个相对 URL,希望一切正常。
    猜你喜欢
    • 1970-01-01
    • 2010-11-14
    • 2018-06-30
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    相关资源
    最近更新 更多