#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()
. Но это не удовлетворит мои потребности, так как мне нужно несколько подключений к БД.