【问题标题】:How to run code depending on whether its running on live website or localhost?如何根据代码是在实时网站上还是在本地主机上运行代码?
【发布时间】:2020-09-26 07:52:43
【问题描述】:

我是编码新手。我有一个使用“Heroku.com”部署的 node.js 应用程序。我想为应用程序使用自定义域,并使用自定义域激活 SSL。当应用程序使用 Heroku 提供的默认域时,SSL 会自动到位,但是如果我希望 SSL 在使用自定义域时工作,我必须在我的 app.js 文件中包含以下代码才能使 SSL 工作:

app.use((req, res, next) => {
if (req.header('x-forwarded-proto') !== 'https')
    res.redirect(`https://${req.header('host')}${req.url}`)
else
    next()

});

这很好用,但是当我在本地维护我的应用程序(在 VS Code 中)并使用 localhost:3000 进行测试时,我必须注释掉上面的代码,以便能够使用 locahost 查看应用程序,因为某些原因与 localhost 不使用 HTTPS 有关。

所以我的问题是,是否有一个代码(if 语句或类似的东西)可以在实际环境中使用该代码时运行该代码,或者如果在 localhost 中使用则不运行该代码。这主要是让我不必在部署和测试前后继续注释掉代码。

如果您对此类事情有任何其他建议或更好的解决方案,我将不胜感激。

干杯, 山姆

【问题讨论】:

  • 这里有两件事。部署站点上的 SSL 证书和本地主机上的 SSL。它们是两个完全不同的东西。我不是 Heroku 人(更喜欢 Azure),但我认为 Heroku 会自动处理您的 SSL 内容,因为他们管理整个事情。由您管理的 localhost 显然没有 SSL 设置。尝试找出如何在 localhost 上设置 SSL,这应该是您的实际前进方向。
  • @Jay 感谢您,如果您使用他们为您的 Web 应用程序提供的默认域名,Heroku 会自动设置 SSL。但是,您将自定义域名指向 Heroku,然后我需要将代码添加到上面提到的应用程序中,以使 SSL 正常工作。通常在 locahost 上设置 SSL 以用于测试目的吗?
  • 当我在本地工作时,我通常不会过多担心 SSL 设置。有时,我正在使用的框架已经设置了 SSL(例如,Visual Studio 自动在 SSL 中运行所有内容,甚至自己添加证书以进行本地测试)。但是,否则,除非我专门测试 SSL,否则我从未使用过它。因此,如果您的测试包含依赖于 SSL 的功能,那么,是的,您应该考虑设置它。如果没有,那么,不,我不会太担心。

标签: javascript node.js ssl heroku https


【解决方案1】:

您可以使用环境变量的概念来区分生产环境(heroku 上的实时网站)和开发环境(localhost)。具体来说,您可以将环境变量 NODE_ENV(只是一种流行的命名约定,没有内置)设置为可以在代码逻辑中使用的值,以根据环境执行操作。

你可以通过写来访问值

const env = process.env.NODE_ENV;

注意:你必须先设置环境变量,否则process.env.NODE_ENV 就是undefined

如何设置环境变量?

有几种方法,例如拥有.env 文件、通过CLI 等。我将向您展示一种快速方法。在本地主机上运行你的服务器时,写这个,

NODE_ENV=development node server.js

现在,在您的 server.js 中,您可以执行类似的操作

// If NODE_ENV is undefined, assume production
const env = process.env.NODE_ENV || 'production';

app.use((req, res, next) => {
  if (env === 'production' && req.header('x-forwarded-proto') !== 'https') {
    res.redirect(`https://${req.header('host')}${req.url}`)
  }
  else {
    next()
  }
})

您可以拥有任意数量的环境(开发、测试、生产、登台等)。另外请查看dotenv module

【讨论】:

    【解决方案2】:

    [编辑]

    在添加 settings.js 中创建名为 config 的文件夹

    package.json
    app.js
    --config    // Will hold your configuration settings
    ----settings.js     // Your settings
    

    在 settings.js 中

    const settings = {
        development: {
            // Developpment configuration settings
            email: 'development@gmail.com'
        },
        staging: {
            // staging settings
            email: 'staging@gmail.com'
        },
        production: {
            // Production configuration settings
            email: 'production@gmail.com'
        },
    }
    
    const getSettings = () => {
        if (!process.env.NODE_ENV) return settings.development
        if (process.env.NODE_ENV === 'staging') return settings.staging
        return settings.production
    }
    
    module.exports = getSettings()
    

    什么是 proccess.env.NODE_ENV?这是一个环境变量,如果你没有声明它会返回 undefined,你可以通过从终端设置它来使其变量不同

    当你去开发时尝试在主机终端中运行这个命令

    export NODE_ENV=production
    

    不要在您的本地终端中运行此程序,尝试询问您的网络托管商如何在他们的命令行中运行命令来存储环境变量

    对于 heroku:heroku 运行导出 process.env.NODE_ENV

    不要在那里写任何敏感数据!也将它们存储在环境变量中

    对于您想要在 app.js 中执行类似操作的端口

    const port = process.env.PORT || 3000
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-02
      • 2020-08-21
      • 1970-01-01
      • 2019-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多