【问题标题】:Run development or production builds in Heroku according to NODE_ENV根据 NODE_ENV 在 Heroku 中运行开发或生产构建
【发布时间】:2021-09-20 01:35:58
【问题描述】:

我有一个 react + express 项目,我在其中进行服务器端渲染。我的文件夹结构是这样的

root
 client
   build
   node_modules
   public
   src
   package.json
 node_modules
 routes
 server.js
 package.json

我有两个 Heroku dynos app-dev 和 app-prod,我将 app-dev 用于开发,将 app-prod 用于生产,它们的环境已相应地设置为 dev 和 prod。我的 package.json 看起来像这样

{
  "name": "name",
  "version": "1.0.0",
  "description": "",
  "main": "server.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node server",
    "server": "nodemon server",
    "client": "npm start --prefix client",
    "build": "cd client/ && npm install && npm run build",
    "dev": "concurrently \"npm run server\" \"npm run client\""
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "body-parser": "^1.18.3",
    "chalk": "^4.1.1",
    "concurrently": "^6.1.0",
    "connect-mongo": "^3.2.0",
    "cookie-parser": "^1.4.3",
    "cookie-session": "^2.0.0-beta.3",
    "cors": "^2.8.5",
    "dotenv": "^10.0.0",
    "express": "^4.16.4",
    "express-session": "^1.15.6",
    "express-validator": "^6.11.1",
    "mongoose": "^5.4.1",
    "mongoose-findorcreate": "^3.0.0",
    "morgan": "^1.10.0",
    "passport": "^0.4.0",
    "passport-google-oauth": "^2.0.0",
    "passport-google-oauth20": "^2.0.0",
    "passport-twitter": "^1.0.4",
    "redux-thunk": "^2.3.0",
    "http-proxy-middleware": "^2.0.0"
  }
}

现在我的 client/src 文件夹中有一个常量文件,其中包含这些

// Constants.js
const prod = {
     url: {
        SS_API_URL: 'https://prod.example.com',
     },
     keys:{
        SS_CLIENT_ID: 'prodClientId',
        SS_X_API_KEY: 'prodApiKey',
     }
};

const dev = {
     url: {
        SS_API_URL: 'https://dev.example.com',  
     },
     keys:{
        SS_CLIENT_ID: 'devClientId',
        SS_X_API_KEY: 'devApiKey',
     } 
};

export const config = process.env.NODE_ENV === 'development' ? dev : prod;

现在当我上传到 Heroku (app-dev) 并构建它时,它似乎使用 prod.example.com 而不是 dev.example.com API 端点。由于 NODE_ENV 是开发,我认为它会使用 SS_API_URL 来开发,但它会使用 SS_API_URL 来生产

【问题讨论】:

    标签: node.js express heroku npm environment-variables


    【解决方案1】:

    您可以在 heroku 项目中的设置菜单“Config Vars”中添加此变量。所以你添加 NODE_ENV 并价值“生产”。

    【讨论】:

    • 我已经使用这个命令 heroku config:set NODE_ENV=development 添加了它,当我使用 heroku run node --app nameofapp console.log(process.env.NODE_ENV) 检查它时,它显示了两个值- 开发和未定义
    最近更新 更多