Node.js 如何让heroku为DB使用环境配置
Heroku在日志中指出,它正试图接触到我没有使用(但使用过一次)的MongoDB碎片。错误消息显示: “无法连接到服务器 [swarmage-shard-00-00-ekq8j.gcp.mongodb.net:27017] 但我不知道它为什么要连接到那个服务器 我正在将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
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')”。这不需要正确的程序。 --第三,不是艾尔