【问题标题】:How do I solve "Middleware "strapi::session": App keys are required" error in my deployment of Strapi to Heroku?如何在将 Strapi 部署到 Heroku 时解决“中间件“strapi::session”:需要应用程序密钥”错误?
【发布时间】:2022-04-24 05:08:44
【问题描述】:

我正在关注 the official instructions 将我的 strapi starter app 部署到 Heroku。该应用程序在本地运行良好。我在部署说明中唯一遗漏的是安装 PG 节点模块(它已经安装,因为我的本地应用程序使用 Postgresql)。

访问 Heroku 日志,我看到了:

error: Middleware "strapi::session": App keys are required. 
Please set app.keys in config/server.js (ex: keys: ['myKeyA', 'myKeyB'])

也许这是一个重要的细节:我遵循了这个过程一次,一切正常。我能够部署到 Heroku。我又试了一次,还是不行。我在想 Heroku 可能在我重用应用名称时遇到了问题,但我尝试在 Heroku 中为应用命名不同的名称,但我仍然遇到同样的错误。

heroku 是否在错误的位置查找我的 server.js 文件?它应该在我的“./config/env/production”文件夹而不是我的“./config”文件夹中查找吗?

按照说明,这是我的 ./config/env/production/database.js

const parse = require('pg-connection-string').parse;
const config = parse(process.env.DATABASE_URL);

module.exports = ({ env }) => ({
  connection: {
    client: 'postgres',
    connection: {
      host: config.host,
      port: config.port,
      database: config.database,
      user: config.user,
      password: config.password,
      ssl: {
        rejectUnauthorized: false
      },
    },
    debug: false,
  },
});

这是我的 ./config/env/production/server.js

module.exports = ({ env }) => ({
    url: env('MY_HEROKU_URL'),
});

这是我的 ./config/server.js

module.exports = ({ env }) => ({
  host: env('HOST', '0.0.0.0'),
  port: env.int('PORT', 1337),
  app: {
    keys: env.array('APP_KEYS'),
  },
});

我的 package.json 很好衡量:

{
  "dependencies": {
    "@strapi/plugin-graphql": "^4.0.0",
    "@strapi/plugin-i18n": "4.0.6",
    "@strapi/plugin-users-permissions": "4.0.6",
    "@strapi/strapi": "4.0.6",
    "lodash.set": "^4.3.2",
    "pg": "8.6.0",
    "pg-connection-string": "^2.5.0"
  },
  "name": "backend",
  "private": true,
  "version": "0.1.0",
  "description": "A Strapi application",
  "scripts": {
    "develop": "strapi develop",
    "start": "strapi start",
    "build": "strapi build",
    "strapi": "strapi"
  },
  "devDependencies": {},
  "author": {
    "name": "A Strapi developer"
  },
  "strapi": {
    "uuid": "f64b509e-2d95-4464-8d39-d6f0d1c7a31a",
    "template": "@strapi/template-corporate@^1.0.0",
    "starter": "@strapi/starter-next-corporate"
  },
  "engines": {
    "node": ">=12.x.x <=16.x.x",
    "npm": ">=6.0.0"
  },
  "license": "MIT"
}

我正在运行 Node v14.18.3 和 NPM v6.14.15

【问题讨论】:

  • Heroku 现在将为我运行该应用程序,但前提是我直接在 ./config/env/production/server.js 文件中列出密钥。任何人都知道为什么 Heroku 没有选择我在根 .env 文件中设置的全局变量吗?
  • 原来我的 .env 在 .gitignore 中,所以 heroku 无法读取密钥。
  • 我可以使用“heroku config:set”命令直接将密钥添加到heroku,这样我就可以将.env 保存在.gitignore 中

标签: node.js heroku strapi


【解决方案1】:

我在./config/env/production/server.js解决了这个问题

module.exports = ({ env }) => ({
  url: env("MY_HEROKU_URL"),
  proxy: true,
  app: {
    keys: env.array("APP_KEYS", ["testKey1", "testKey2"]),
  },
});

testKey1、testKey2 只是占位符,需要通过 heroku 中的 CONFIG VAR 替换为 2 个随机键

APP_KEYS=someSecret,anotherSecret

proxy: true 也很重要。否则它会抛出一个Cannot send secure cookie over unencrypted connection

【讨论】:

  • 谢谢。我发现我的 .env 文件在 .gitignore 中,所以当我包含它时,Heroku 能够访问 .env 文件中的应用程序密钥。然后我不需要将它们包含在 server.js 中
  • 请避免提交您的 env 文件或对其进行硬编码。相反,您可以从 heroku cli 或仪表板设置环境。
  • 谢谢,这应该在文档中。
  • 我是唯一一个对这个答案毫无意义的人吗?用 2 个随机键替换占位符?我可以通过显示 env 变量 - strpi 键替换 heroku 仪表板中的键来实现此功能。键:env.array("APP_KEYS", ["DATABASE_URL", "MY_HEROKU_URL", "NODE_ENV"]),
【解决方案2】:

在 Heroku 上,对于该特定应用,导航至 Settings->Config vars 并在其中添加您的环境变量。

【讨论】:

    【解决方案3】:

    只需在项目的根目录中创建.env 文件,如下所示:

    HOST=0.0.0.0
    PORT=1337
    APP_KEYS=jP8pb1lYsAhnmURarewxhA==,34xnLMYHY5jiU7ONTstTqQ==
    

    【讨论】:

      【解决方案4】:

      所以你只需要在 Heroku settings->config vars 中创建一个名为 APP_KEYS 的变量。这个变量的值你可以从你的.env文件中得到,你应该有APP_KEYS变量的值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-11-16
        • 2021-03-11
        • 2021-04-07
        • 1970-01-01
        • 2020-06-26
        • 1970-01-01
        • 2020-11-06
        相关资源
        最近更新 更多