它如何知道DB的地址而不将其传递给Schema



当某个东西工作时,通常不会问问题,但这很好。我正在Nuxt应用程序中使用与Mongodb的连接。

声明DB地址的唯一位置是索引.js

const express = require('express');
const mongoose = require('mongoose');
const apiRouter = require('./apiRouter');
const app = express();
app.use(express.json());
mongoose.connect('mongodb://localhost/sun-v2', {useNewUrlParser: true})
app.use(apiRouter);
module.exports = {
path: '/server',
handler: app
}

正如您所看到的,猫鼬对象没有被导出。在我的apiRouter.js中,模型是必需的,并且运行良好:

const express = require('express');
const PlayerModel = require('./models/player');
const app = express();
app.get('/players', async (req, res) => {
const players = await PlayerModel.find({});
try {
res.send(players);
} catch (error) {
res.status(500).send(error);
}
});

我不明白的是,如果既不导出路径也不导出连接,Model.find()如何知道在哪里搜索DB。

如果我有多个DB地址,我该如何选择要使用的连接?我有不止一个开放的mongo数据库,它怎么知道它必须使用我在索引中连接的那个数据库?

当您使用mongoose.connect()时,mongoose在内部创建一个连接,并使其成为"默认连接"。这是一种适用于大多数情况的便利性。

如果您需要多个连接,则必须使用方法mongoose.createConnection()(mongoose.connect()在后台使用的方法(手动创建它们。

const conn = mongoose.createConnection("mongodb://localhost/sun-v2", {
useNewUrlParser: true
});

不过,有一点需要注意,您不能再简单地导出模型了。您将不得不导出模式,这样您就可以为每个连接创建单独的模型。在你的情况下,你会有这样的东西:

const express = require('express');
const mongoose = require('mongoose');
// Export your schema instead your model
const PlayerSchema = require('./models/player');
const app = express();
const conn1 = mongoose.createConnection("mongodb://localhost/sun-v2", {
useNewUrlParser: true
});
const conn2 = mongoose.createConnection("mongodb://anotherhost/sun-v2", {
useNewUrlParser: true
});

// ...
const PlayerModel1 = conn1.model('User', PlayerSchema);
const PlayerModel2 = conn2.model('User', PlayerSchema);
// ...
app.get('/players', async (req, res) => {
const playersFromConn1 = await PlayerModel1.find({});
const playersFromConn2 = await PlayerModel2.find({});
// ...
});

有关多个连接的更多信息,您可以查看Mongoose文档https://mongoosejs.com/docs/connections.html#multiple_connections

最新更新