如何让heroku为DB

时间:2019-06-28 22:43:51

标签: node.js mongodb heroku postman mlab

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配置(转到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

我的设置(进入“群集图集”-有效)

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:错误的身份验证失败。] \ nMongoNetworkError:   无法连接服务器   第一次连接时[swarmage-shard-00-00-ekq8j.gcp.mongodb.net:27017]   [MongoError:错误的身份验证失败。] \ n在Pool。   (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_visible.js:284:12)\ n在可读AddChunk   (_stream_visible.js:265:11)\ n在TLSSocket.Readable.push   (_stream_visible.js:220:10)\ n位于TLSWrap.onStreamRead [读取时]   (internal / stream_base_commons.js:94:17)“,” stack“:” MongoNetworkError:   无法连接服务器   第一次连接时[swarmage-shard-00-00-ekq8j.gcp.mongodb.net:27017]   [MongoError:错误的身份验证失败。] \ n在Pool。   (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

1 个答案:

答案 0 :(得分:0)

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