Как он узнает адрес БД, не передавая его в Схемы? - PullRequest
0 голосов
/ 17 февраля 2020

Обычно задают вопрос, когда что-то работает, но это работает хорошо. Я использую соединение с Mongodb в приложении Nuxt.

Единственное место, где объявлен адрес БД, находится в индексе . 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
}

Как видите, mon goose Объект не экспортируется. В моем 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() знает, где искать БД, если ни путь, ни соединение не экспортируются.

Что если у меня более одного адреса БД, как я могу выбрать соединение, которое хочу использовать? У меня есть более одной открытой базы данных mon go, откуда она знает, что должна использовать ту, к которой я установила соединение в индексе?

1 Ответ

2 голосов
/ 17 февраля 2020

Когда вы используете mongoose.connect(), mon goose создает внутреннее соединение и делает его «соединением по умолчанию». Это удобство, которое работает в большинстве случаев.

Если вам нужно более одного соединения, вам нужно создать их вручную, используя метод 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({});

    // ...
});

Вы можете проверить документацию Mon goose для получения дополнительной информации о нескольких соединениях на https://mongoosejs.com/docs/connections.html#multiple_connections

...