如何让 heroku 使用 DB 的环境配置

Posted

技术标签:

【中文标题】如何让 heroku 使用 DB 的环境配置【英文标题】:How to get heroku to use environmental config for DB 【发布时间】:2019-11-10 19:41:35 【问题描述】:

Heroku 在日志中识别出它正在尝试访问我没有使用(但使用过一次)的 MongoDB 分片。错误消息说:

"连接服务器失败 [swarmage-shard-00-00-ekq8j.gcp.mongodb.net:27017]"

但我不知道它为什么要尝试连接到该服务器。

我正在将node.js 应用程序部署到heroku。 Heroku 链接到我的MLAB 数据库。 我可以通过 mongo shell 与数据库进行交互。当我在本地服务器上运行时,邮递员可以对 MLAB 数据库执行所有 CRUD 操作。但是,当我在邮递员中使用 heroku 网址时,出现 503 错误。日志显示“MongoNetworkError”和“TransientTransactionError”。但我认为主要问题是它试图访问我不再运行的 Cloud Atlas 分片。我的代码中没有连接字符串;它们都是由环境变量设置的。我已经更新并仔细检查了我的本地系统是否都设置为新的连接字符串,以及 heroku 是否配置为新的连接字符串。我不知道heroku(或mlab?或mongodb?)从哪里获取旧的连接分片。

我已经为heroku 和本地服务器尝试了未设置的配置。我试图在cluster atlas 上找到旧的分片实例,但找不到。在我尝试使用邮递员联系 heroku 地址之前,一切正常。

我在 heroku docs 或 mongo 中找不到任何关于除了单击连接字符串并将它们放入代码之外的事情。我还尝试将正确的连接字符串直接放入代码中——没有变化。

我认为我需要更改某个默认设置,但我不知道在哪里。

我认为代码不会有帮助,但为了显示代码(一切都在Github)

生产配置:


  "name": "SwarmAge - Production",
  "mail": 
    "host": "prod-mail-server"
  ,
  "title": "Welcome to the Swarm Age"


自定义环境变量


  "mail": 
    "password": "SwarmAge_password"
  ,
  "jwtPrivateKey": "SwarmAge_jwtPrivateKey",
  "connectionString": "SwarmAge_db"

index.js

const express = require("express");
const app = express();
const winston = require("winston");

require("./startup/logging")();
require("./startup/routes")(app);
require("./startup/db")();
require("./startup/config")();
require("./startup/validation")();
require("./startup/prod")(app);
require("./startup/status")(app);

app.set("view engine", "pug");
app.set("views", "./views");

const port = process.env.PORT || 3000;
const server = app.listen(port, () =>
  winston.info(`Listening on port $port`)
);

module.exports = server;

启动配置

const config = require("config");

module.exports = function() 
  if (!config.get("jwtPrivateKey")) 
    throw new Error("FATAL ERROR: jwtPrivateKey is not defined.");
  
;

启动数据库

module.exports = function() 
  const db = config.get("connectionString");
  mongoose
    .connect(db, 
      useNewUrlParser: true,
      useFindAndModify: false
    )
    .then(() => winston.info(`Connected to $db . . .`));
;

从终端, heroku configs(去 Heroku,从哪里得到碎片?):-------

C:\Users\tedgo\voter>heroku config

swarmage-backend-190625 配置变量

NODE_ENV: production
SwarmAge_db: mongodb://AdminGLOC:fakopassword@ds155461.mlab.com:55461/heroku_6qxb8b19
SwarmAge_jwtPrivateKey: hidden
SwarmAge_password: not-important
jwtPrivateKey: took-this-out-as-well

我的设置(转到 Cluster Atlas——这可行)

SwarmAge_db=mongodb+srv://AdminGLOC:not-my-real-password@swarmage-0idyv.gcp.mongodb.net/development?retryWrites=true

这是来自日志的错误消息:

cat uncaughtExceptions.log "error":"name":"MongoNetworkError","errorLabels":["TransientTransactionError"],"level":"error","message":"uncaughtException: 无法连接服务器 [swarmage-shard-00-00-ekq8j.gcp.mongodb.net:27017] 首次连接 [MongoError: bad auth 身份验证失败。]\nMongoNetworkError: 无法连接服务器 [swarmage-shard-00-00-ekq8j.gcp.mongodb.net:27017] 首次连接 [MongoError: bad auth Authentication failed.]\n 在池中。 (C:\Users\tedgo\node_modules\mongodb-core\lib\topologies\server.js:431:11)\n 在 Pool.emit (events.js:189:13)\n 在连接 (C:\Users\tedgo\node_modules\mongodb-core\lib\connection\pool.js:557:14)\n 在回调 (C:\Users\tedgo\node_modules\mongodb-core\lib\connection\connect.js:109:5)\n 在 provider.auth.err (C:\Users\tedgo\node_modules\mongodb-core\lib\connection\connect.js:352:21)\n 在 _authenticateSingleConnection (C:\Users\tedgo\node_modules\mongodb-core\lib\auth\auth_provider.js:66:11)\n 在 sendAuthCommand (C:\Users\tedgo\node_modules\mongodb-core\lib\auth\scram.js:215:18)\n 在 Connection.messageHandler (C:\Users\tedgo\node_modules\mongodb-core\lib\connection\connect.js:334:5)\n 在 Connection.emit (events.js:189:13)\n 在 processMessage (C:\Users\tedgo\node_modules\mongodb-core\lib\connection\connection.js:364:10)\n 在 TLSSocket。 (C:\Users\tedgo\node_modules\mongodb-core\lib\connection\connection.js:533:15)\n 在 TLSSocket.emit (events.js:189:13)\n 在 addChunk (_stream_readable.js:284:12)\n 在 readableAddChunk (_stream_readable.js:265:11)\n 在 TLSSocket.Readable.push (_stream_readable.js:220:10)\n 在 TLSWrap.onStreamRead [as onread] (internal/stream_base_commons.js:94:17)","stack":"MongoNetworkError: 无法连接服务器 [swarmage-shard-00-00-ekq8j.gcp.mongodb.net:27017] 首次连接 [MongoError: bad auth Authentication failed.]\n 在池中。 (C:\Users\tedgo\node_modules\mongodb-core\lib\topologies\server.js:431:11)\n 在 Pool.emit (events.js:189:13)\n 在连接 (C:\Users\tedgo\node_modules\mongodb-core\lib\connection\pool.js:557:14)\n 在回调 (C:\Users\tedgo\node_modules\mongodb-core\lib\connection\connect.js:109:5)\n 在 provider.auth.err (C:\Users\tedgo\node_modules\mongodb-core\lib\connection\connect.js:352:21)\n 在 _authenticateSingleConnection (C:\Users\tedgo\node_modules\mongodb-core\lib\auth\auth_provider.js:66:11)\n 在 sendAuthCommand (C:\Users\tedgo\node_modules\mongodb-core\lib\auth\sc

【问题讨论】:

当你说你已经删除了 Heroku 上的配置时,你的意思是来自project->settings->Config vars 【参考方案1】:

这个答案来自编码员 Santiago Beltram。 - 几个问题。 --首先,default.config 文件需要保存在 custom-environmental-variable 中找到的所有变量。它没。 --其次,在models.supporters.js中有一个错误,其中“require('jsonwebtoken')”写成驼峰式“require('jasonWebToken')”。这不需要适当的程序。 --第三,不是所有的依赖都出现在package.json文件中。因此,heroku 不知道包含它们。 在通过使用 --save 标志修复代码并在 package.json 中包含缺少的依赖项后,程序已成功部署到 heroku。

【讨论】:

以上是关于如何让 heroku 使用 DB 的环境配置的主要内容,如果未能解决你的问题,请参考以下文章

如何使用环境变量配置 Hibernate

如何使用环境变量配置Hibernate

在heroku上查看rails4 db日志

如何配置node环境配

如何配置环境变量及检查环境变量是不是配好

如何删除 Github 环境