Параметр прототипа NodeJS не определен - PullRequest
0 голосов
/ 17 апреля 2019

Я пытаюсь использовать модель базы данных, которую создаю в других функциях-прототипах, но она всегда возвращает ошибку «Ошибка при инициализации модели», поэтому this.model пуст.Что-то не так с моим объектом в целом, потому что все решения, которые я нашел по этой теме, не имели проблем с 'this' внутри функций прототипа.

Версия моего узла: 11.9.0

function CRUD (collection /* String */, schema /* mongoose.Schema */) { 
    this.model = db.model(collection, schema)
    console.log('Model initialized ')
}
CRUD.prototype.create = function (req, res, next) {
   if(!this.model) throw new Error('No Model initialized')
   this.model.create(req.body, (err, data) => {
        if (err){
            res.send('Can`t create Object')
        } else{
            console.log(data, ' created')
            next()
        }

    })
}
CRUD.prototype.read = function (req, res, next) {
    if(!this.model) throw new Error('No Model initialized')
    if(req.query){ // for GET requests
        var filter = req.query
    }else if(req.body){ // for other requests
        var filter = req.body
    }else{
        var filter = {} // no filter
    }
    this.model.find(filter, req.body, (err, data) => {
        if (err){
            res.send('Can`t find Object')
        } else{
            req.body = data
            next()
        }  
    })
}

Код работал уже, когда я использовал вместо 'this.model' 'CRUD.prototype.model', но мне пришлось изменить его, потому что модель была своего рода статическим параметром в прототипе, и мне нужны другие модели длякаждый объект CRUD.

1 Ответ

0 голосов
/ 17 апреля 2019

this определяется тем, как вы вызываете функцию. Если вы передаете эти функции как обратные вызовы чему-то вроде экспресс-маршрута, вы теряете привязку this. Вам нужно передать функции с чем-то вроде:

cConfig = new crud('Config', new db.Schema(schemas.Config))
app.get('/', cConfig.create.bind(cConfig))

Вот простой пример, который может помочь показать проблему:

function someObj(f_name){
  this.f_name = f_name
}

someObj.prototype.talk = function(){
  console.log(this.f_name)
}

let me = new someObj("mark")
me.talk() // works as expected

/* some function that takes a callback */
function runCB(cb){
  cb()
}

// pass in talk:

runCB(me.talk)          // doesn't work because this binding is lost 
                        // the CB is just passed as a function reference
                        // and so we no longer know it belongs with `me`

runCB(me.talk.bind(me)) // but it works it you hard bind it back
runCB(() => me.talk())  // also works because we call it as me.talk()
...