Проблемы с созданием модульных абстрактных функций для обновления базы данных mongodb (mongoose) - PullRequest
0 голосов
/ 26 августа 2018

Я пытаюсь создать модульную и абстрактную группу функций для сохранения данных в моей базе данных Mongodb (Mongoose), используя Node JS, вот так:

const mongoose = require('mongoose')
mongoose.connect('xyz123blahblahblah')
const db       = mongoose.connection
const Schema   = mongoose.Schema
const ObjectId = Schema.ObjectId

var doc
var docInstance

// Connect to the database.
function connect() {
    console.log('Establishing a connection.')
    db.on('error', console.error.bind(console, 'Connection error:'))

    db.once('open', function() {
      console.log('Connection established.')
      updateCollection() 
    })
}

function updateCollection(schemaName, schemaObject, schemaProperties) {
    doc         = mongoose.model(schemaName, schemaObject)
    docInstance = new doc(schemaProperties)
}

function save() {
    console.log('Saving document to the collection.')
    docInstance.save(function (err, docInstance) {
        if (err) { return console.error(err) } 
        else { console.log('Document was succesfully added.') }
    })
}

Теперь идея в том, что позже я могуэкспортируйте эти функции и вызывайте их последовательно следующим образом:

// Define the Collection model.
const User = new Schema( { name: String, email: String, id: ObjectId} )

connect()
updateCollection('users', User, { name: 'Testy McTest', email: 'test@test.co' })
save()

Мне не имеет смысла передавать параметры для функции updateCollection () через функцию connect (), поскольку они по существу отвечают за дваболее или менее разные вещи, но моя функция updateCollection () должна вызываться ВНУТРИ моей функции connect ().

Идеальным решением для меня было бы иметь возможность делать следующее:

// Define the Collection model.
const User = new Schema( { name: String, email: String, id: ObjectId} 

connect(updateCollection('users', User, { name: 'Testy McTest', email: 'test@test.co' }))
save()

Я немного растерялся, что делать дальше.Можно ли построить мои функции connect () и updateCollection () таким образом, чтобы обеспечить разделение интересов?Любая помощь будет высоко ценится!

1 Ответ

0 голосов
/ 26 августа 2018
var doc
var docInstance

function connect(updateCollection) {
    console.log('Establishing a connection...')
    db.on('error', console.error.bind(console, 'Connection error:'))

    db.once('open', function() {
      console.log('Connection established.')
      updateCollection 
    })
}

function updateCollection(schemaName, schemaObject, schemaProperties) {
    doc = mongoose.model(schemaName, schemaObject)
    for (let i = 0; i < schemaProperties.length; i++) { 
        docInstance = new doc(schemaProperties[i])
        save() 
    }
    /*  
        TODO:
        The connection is currently being closed BEFORE
        all collections have been added to the database.
        We need a way to prevent the connection from closing
        until all Update operations are complete.
    */
    // console.log('Closing the connection.')
    // mongoose.connection.close()
}

function save() {
    console.log('Saving document to the collection...')
    docInstance.save(function (err, docInstance) {
        if (err) { return console.error(err) } 
        else { console.log('Document was succesfully added.') }
    })
}

Потратив много времени на это, я считаю, что нашел оптимальное решение. Callbacks. Теперь я могу вызвать мою функцию connect () следующим образом:

connect(updateCollection( 'users', User, [{ name: 'Testy 5', email: 'test5@test.co' }, { name: 'Testy 6', email: 'test6@test.co' }] ))

Кроме того, я обновил свой метод updateCollection (), чтобы он брал число X в массиве объектов для обновления строк в db:)

...