已连接到MLab,但不会连接到本地主机

时间:2019-09-05 16:23:58

标签: mongodb heroku mongoose

我在localhost和MLab上都可以正常工作,但是后来不得不切换数据库。经过大量的尝试,我在MLab上建立了数据库,但是现在它没有连接到我的本地主机。这是我的server.js文件:

const path = require("path");
const PORT = process.env.PORT || 3001;
const app = express();
const mongoose = require("mongoose");
const routes = require("./routes");

// Connect to the Mongo DB

mongoose.connect(process.env.MONGODB_URI || 'mongodb://XXUSERXX:XXPASSWORDXX@ds217388-a0.mlab.com:17388,ds217388-a1.mlab.com:17388/<dbname>?replicaSet=rs-ds217388', { useNewUrlParser: true });
mongoose.connection.on("open", function (ref) {
  console.log("Connected to mongo server.");
});
mongoose.connection.on('error', function (err) { console.log(err) });


// Define middleware here
app.use(express.urlencoded({ extended: true }));
app.use(express.json());
// Serve up static assets (usually on heroku)
if (process.env.NODE_ENV === "production") {
  app.use(express.static("client/build"));
}
// Add routes, both API and view
app.use(routes);

// Define API routes here

// Send every other request to the React app
// Define any API routes before this runs
app.get("*", (req, res) => {
  res.sendFile(path.join(__dirname, "./client/build/index.html"));
});

app.listen(PORT, () => {
  console.log(`? ==> API server now on port ${PORT}!`);
});

我更改的唯一代码行是下面的代码,这是以前的代码:

mongoose.connect(process.env.MONGODB_URI || 'mongodb://localhost:27017/wineDB', { useNewUrlParser: true });

我在Heroku中连接了此应用,并在Config Vars中定义了MONGODB_URI,但是直到我将连接字符串手动放入server.js文件后,它才与第二个数据库一起使用。第一个可以正常工作,我不明白为什么!

当它不在MLAB上运行时如何进行连接以查找本地主机,以便进行测试?感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

似乎混淆来自于是否定义了环境变量以及您的应用程序是否正在使用该变量而不是回到定义的变量的几种不同组合。

MONGODB_URI环境变量应包含connection string for your mLab database,并在您的Heroku环境中在本地和部署时进行定义。我假设变量process.env.LOCAL仅在您的应用程序应连接到本地数据库的情况下出现在您的本地环境中。

在这些情况下,应执行以下操作:

if(process.env.LOCAL || process.env.MONGODB_URI) {
  mongoose.connect(process.env.LOCAL || process.env.MONGODB_URI, { useNewUrlParser: true });
  ...
} else {
  console.log("MongoDB connection string not defined!");
}

我们首先放置process.env.LOCAL,然后放置||,说它在连接时会得到优先选择。然后,Mongoose应该连接到process.env.LOCAL中定义的任何内容(即您本地的MongoDB数据库),否则返回到process.env.MONGODB_URI(即mLab)。

最后,如果两个值都未定义,则将其包装在简单的if-else中,以输出错误消息。