Mongoose createConnection и Document.prototype.save()

#javascript #node.js #mongodb #express #mongoose

#javascript #node.js #mongodb #выразить #mongoose

Вопрос:

Я создаю многопользовательское приложение с несколькими подключениями (максимум 3 или 4) на одном хосте mongo. Что я действительно делаю, так это устанавливаю соединения mongoose при запуске сервера и сохраняю его в объекте контекста.

 // For each tenants
tenantConnection(name, uri) => new Promise((resolve, reject) => {
    const connection = mongoose.createConnection(uri, {
      useCreateIndex: true,
      useNewUrlParser: true,
      useFindAndModify: false,
      retryWrites: false,
      useUnifiedTopology: true
    })
    connection.on('connected', async () => {
      const MessageModel = connection.model('Message', Message) // <- Message is a classic mongoose Schema
      ...
      return resolve({ connection, models: { Message: MessageModel } })
    })
  })
  

Все работает хорошо, за исключением случаев, когда я пытаюсь использовать прототип .save() (то же самое с Model.create({...}) . Когда я пытаюсь создать новую запись, функция зависает, обратный вызов не запускается и никаких ошибок.

 const { models: { Message } } = tenant
const messageRecord = new Message({ content }
await messageRecord.save() // -> Stuck here, nothing happens
  

На данный момент единственный способ, который я нашел, — это использовать UpdateOne({}, {...}, {upsert: true}) для создания записей, но я бы предпочел использовать собственный прототип mongoose .save() для запуска установщиков из моей схемы.

Кто-нибудь имеет представление о том, что я делаю неправильно?

Комментарии:

1. Для начала, я думаю, вы слишком усложняете настройку соединения и объявление модели, вы можете просто запустить соединение, привязать подключенное событие к соединению и параллельно создавать модели, mongoose ставит в очередь все, что делается до его подключения, поскольку my — это что-то, связанное с this контекстомв модели чего-то не хватает на этом пути.

2. Я пытался объявить модели до connected события и после, непосредственно в контроллере, где я его использую, и, к сожалению, он по-прежнему действует одинаково:( .Я читал похожие проблемы, но почти каждый раз единственным ответом является использование методов connect() вместо createConnection() . Но это не удовлетворит мои потребности, так как мне нужно несколько подключений к БД.