Node.js 如何让heroku为DB使用环境配置

Node.js 如何让heroku为DB使用环境配置,node.js,mongodb,heroku,postman,mlab,Node.js,Mongodb,Heroku,Postman,Mlab,Heroku在日志中指出,它正试图接触到我没有使用(但使用过一次)的MongoDB碎片。错误消息显示: “无法连接到服务器 [swarmage-shard-00-00-ekq8j.gcp.mongodb.net:27017] 但我不知道它为什么要连接到那个服务器 我正在将node.js应用程序部署到heroku。Heroku链接到我的MLAB数据库。 我可以通过mongo shell与数据库交互。当我在本地服务器上运行时,postman可以在MLAB数据库上执行所有CRUD操作。然而,当我在po

Heroku在日志中指出,它正试图接触到我没有使用(但使用过一次)的MongoDB碎片。错误消息显示:

“无法连接到服务器 [swarmage-shard-00-00-ekq8j.gcp.mongodb.net:27017]

但我不知道它为什么要连接到那个服务器

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

我已尝试取消设置heroku和本地服务器的配置。我试图在
集群atlas
上找到碎片的旧实例,但找不到。在我尝试使用邮递员联系heroku地址之前,一切正常

在heroku文档或mongo中,除了单击连接字符串并将其放入代码中之外,我找不到任何其他内容。我还尝试将正确的连接字符串直接放入代码中——没有更改

我想我需要更改某个地方的默认设置,但我不知道在哪里

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

生产配置:

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

}
自定义环境变量

{
  "mail": {
    "password": "SwarmAge_password"
  },
  "jwtPrivateKey": "SwarmAge_jwtPrivateKey",
  "connectionString": "SwarmAge_db"
}
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;
index.js

{
  "mail": {
    "password": "SwarmAge_password"
  },
  "jwtPrivateKey": "SwarmAge_jwtPrivateKey",
  "connectionString": "SwarmAge_db"
}
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配置(转到heroku,从哪里获取碎片?)-------

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
我的设置(转到ClusterAtlas——这很有效)

下面是日志中的错误消息:

cat uncaughtExceptions.log {“error”:{“name”:“MongoNetworkError”,“errorLabels”:[“TransientTransactionError”]},级别为“error”,“message”:“uncaughtException: 无法连接到服务器 第一次连接时[swarmage-shard-00-00-ekq8j.gcp.mongodb.net:27017] [MongoError:错误的身份验证失败。]\n MongoNetworkError: 无法连接到服务器 第一次连接时[swarmage-shard-00-00-ekq8j.gcp.mongodb.net:27017] [MongoError:错误的身份验证失败。]\n在池中。 (C:\Users\tedgo\node\u modules\mongodb core\lib\topologies\server.js:431:11)\n 在Pool.emit(events.js:189:13)\n在connect (C:\Users\tedgo\node\u modules\mongodb core\lib\connection\pool.js:557:14)\n 回拨时 (C:\Users\tedgo\node\u modules\mongodb core\lib\connection\connect.js:109:5)\n 在provider.auth.err处 (C:\Users\tedgo\node\u modules\mongodb core\lib\connection\connect.js:352:21)\n at_认证单连接 (C:\Users\tedgo\node\u modules\mongodb core\lib\auth\auth\u provider.js:66:11)\n 在sendauth命令下 (C:\Users\tedgo\node\u modules\mongodb core\lib\auth\scram.js:215:18)\n 在Connection.messageHandler上 (C:\Users\tedgo\node\u modules\mongodb core\lib\connection\connect.js:334:5)\n 在Connection.emit处(events.js:189:13)\n在processMessage处 (C:\Users\tedgo\node\u modules\mongodb core\lib\connection\connection.js:364:10)\n 在TLSSocket。 (C:\Users\tedgo\node\u modules\mongodb core\lib\connection\connection.js:533:15)\n 在TLSSocket.emit处(events.js:189:13)\n在addChunk处 (\u stream\u readable.js:284:12)\n位于readableAddChunk (\u stream\u readable.js:265:11)\n位于TLSSocket.readable.push (\u stream\u 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:错误的身份验证失败。]\n在池中。 (C:\Users\tedgo\node\u modules\mongodb core\lib\topologies\server.js:431:11)\n 在Pool.emit(events.js:189:13)\n在connect (C:\Users\tedgo\node\u modules\mongodb core\lib\connection\pool.js:557:14)\n 回拨时 (C:\Users\tedgo\node\u modules\mongodb core\lib\connection\connect.js:109:5)\n 在provider.auth.err处 (C:\Users\tedgo\node\u modules\mongodb core\lib\connection\connect.js:352:21)\n at_认证单连接 (C:\Users\tedgo\node\u modules\mongodb core\lib\auth\auth\u provider.js:66:11)\n 在sendauth命令下 (C:\Users\tedgo\node\u modules\mongodb core\lib\auth\sc


这个答案来自编码员圣地亚哥·贝尔特拉姆。 -几个问题。
--首先,default.config文件需要保存在自定义环境变量中找到的所有变量。它没有。 --其次,在models.supporters.js中,出现了一个错误,其中“require('jsonwebtoken')”是用驼峰格式写的“require('jasonWebToken')”。这不需要正确的程序。 --第三,并非所有依赖项都出现在package.json文件中。因此,heroku不知道要包含它们。

在修复代码并使用--save标志将缺少的依赖项包含在package.json中后,该程序成功部署到heroku。

这个答案来自编码员Santiago Beltram。 -几个问题。
--首先,default.config文件需要保存在自定义环境变量中找到的所有变量。它没有。 --其次,在models.supporters.js中,出现了一个错误,其中“require('jsonwebtoken')”是用驼峰格式写的“require('jasonWebToken')”。这不需要正确的程序。 --第三,不是艾尔