如何运行代码(取决于代码是在实时网站上还是在本地主机上运行)?

时间:2020-09-26 07:52:43

标签: javascript node.js ssl heroku https

我是编码新手。我有一个使用“ 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一起使用。

所以我的问题是,是否有代码(如果语句或类似的东西)在实际环境中使用时将运行该代码,或者在本地主机中使用时将不运行该代码。主要是因为这样,在部署和测试之前和之后,我不必继续注释掉代码。

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

干杯, 山姆

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

[编辑]

在添加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是什么?这是一个环境变量,如果您未声明它将返回未定义,则可以通过在终端上进行设置来使其与众不同

进行开发时,请尝试在主机终端上运行此命令

export NODE_ENV=production

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

对于heroku:heroku运行导出过程。env.NODE_ENV

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

对于端口,您还希望在app.js中执行类似的操作

const port = process.env.PORT || 3000