Как работает mongoose.connect (connectionSring)? - PullRequest
0 голосов
/ 03 февраля 2019

Я пришел из питона, когда подключался к базам данных и выполнял sql без ORM.Скажем, с библиотекой python cx_Oracle, вот так:

>>> conn = cx_Oracle.connect(connectionString)
>>> curs = conn.cursor()
>>> _ = curs.execute(...)

Точнее говоря, все мои вызовы направляются в базу данных через возвращенный объект соединения conn, а не саму библиотеку cx_Oracle.

В приложении express, использующем mongodb с node.js и mongoose, мы можем сделать что-то вроде:

require('./models/user'); // Defines new Schema in mongoose named 'users'
require('./services/passport');  // receives data from OAuth flow
// and writes new authenticated users to MongoDB database

mongoose.connect(keys.mongoURI, {useNewUrlParser: true});

const app = express();
require('./routes/authRoutes')(app);  // handle OAuth routes and pass to passport authentication

// server runs and listens to routes etc

Кажется, что импортированная библиотека mongoose сама по себеполучить новые свойства от:

mongoose.connect(keys.mongoURI, {useNewUrlParser: true});

Поскольку последующие вызовы, подобные приведенным ниже в ./services/passport.js для создания новых пользователей, не имеют явной ссылки на наше соединение.

const User = mongoose.model('users');

// within an OAuth callback
new User({ id: response.data.id })
  .save()
  .then(...)

У меня естьпосмотрел на источник Mongoose.prototype.connect, чтобы понять это, но смущен оператором return.После того, как обещание выполнено, оно возвращает функцию стрелки с _mongoose, нашим экземпляром самого прототипа Mongoose с новым подключением, но мы ничего не возвращаем в нашем приложении.

Mongoose.prototype.connect = function() {
  const _mongoose = this instanceof Mongoose ? this : mongoose;
  const conn = _mongoose.connection;
  return conn.openUri(arguments[0], arguments[1], arguments[2]).then(() => _mongoose);
};

МожетКто-нибудь, пожалуйста, объясните, что происходит с нашей импортированной библиотекой mongoose, когда мы вызываем mongoose.connect(...)?Или, может быть, пришлите некоторые ресурсы, чтобы я мог увидеть простой пример этого?Спасибо.

1 Ответ

0 голосов
/ 03 февраля 2019

Mongoose попытается соединиться с MongoClient внутренне и вернет экземпляр mongoose.

const promise = new Promise((resolve, reject) => {
    const client = new mongodb.MongoClient(uri, options);
    _this.client = client;
    client.connect(function(error) {
      if (error) {
        _this.readyState = STATES.disconnected;
        return reject(error);
      }

      const db = dbName != null ? client.db(dbName) : client.db();
      _this.db = db;

}

это внутренний процесс функции "conn.openUri", и mongoose выполнит эту функцию.Вы также можете подключить mongoClient напрямую, не используя mongoose.

https://mongodb.github.io/node-mongodb-native/api-generated/mongoclient.html
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...