новый объект в конструкторе из класса undefined

Я создаю новый объект из класса в конструкторе, и всякий раз, когда он запускается, я получаю сообщение об ошибке, которое не определено в методе, хотя оно определено в конструкторе. Operate сам по себе тщательно протестирован и отлично работает в отдельном контексте, так что это не проблема. Я создаю его с помощью Babel, не запускаю его непосредственно в Node 7.0.0.

import Operate from "./operate"

export default class {

  constructor(Schema) {
    this.schema = Schema
    this.operate = new Operate(this.schema)
    console.log(this.operate.run) // <- Logs just fine
  }

  update(req, res) {
    console.log(this.operate.run) // <- Nada
    this.operate.run(req.body)
      .then(value => {
        res.status(200).json(value)
      })
  }

введите здесь описание изображения

Такое ощущение, что я упускаю что-то фундаментальное. Я слышал, что это не самый лучший шаблон, поэтому, пожалуйста, не стесняйтесь предлагать лучший способ. Большое спасибо заранее.

ОБНОВЛЕНИЕ: Вот как используется обновление. Я не подозреваю, что здесь есть какая-то проблема, так как он отлично работал, когда я импортировал контроллер как функцию из другого модуля, а не класса.

import {Router, } from "express"
import Controller from "../controller"
import User from "./user.model"

let controller = new Controller(User)
let router = new Router()

router.post("/", controller.update)

module.exports = router

person Gabriel Kunkel    schedule 23.01.2017    source источник
comment
как вы выполняете обновление?   -  person Jaromanda X    schedule 23.01.2017
comment
Это функция, переданная в экспресс-маршрут.   -  person Gabriel Kunkel    schedule 23.01.2017
comment
проблема заключается в том, что this в вызове обновления, возможно, не определено? попробуйте console.log(this) вверху обновления, чтобы увидеть, что это такое   -  person Jaromanda X    schedule 23.01.2017
comment
в constructor попробуйте добавить this.update = this.update.bind(this).   -  person Saad    schedule 23.01.2017
comment
возможно, именно поэтому я видел this.update = this.update.bind(this); - теперь это имеет смысл :p   -  person Jaromanda X    schedule 23.01.2017
comment
Вау, это сработало. Я должен сделать это со всеми методами? Должен быть короткий путь? Если вы напишете что-либо из этого в ответе, я буду голосовать за вас. ... Так много помощи! :-)   -  person Gabriel Kunkel    schedule 23.01.2017
comment
I have to do that with all of the methods? - только те, которые нужны   -  person Jaromanda X    schedule 23.01.2017


Ответы (1)


Измените это:

router.post("/", controller.update)

к этому:

router.post("/", controller.update.bind(controller))

Когда вы передаете controller.update, он передает только указатель на метод, и любая связь с объектом controller теряется. Затем, когда этот метод update вызывается позже, нет связи с соответствующим объектом, и поэтому обработчик this в методе неверен, и вы получаете ошибку, которую вы видели.

Вы либо принудительно связываете метод update внутри объекта, либо когда вы передаете метод в другом месте, которое может быть вызвано неправильно, вы можете использовать приведенную выше структуру для передачи связанной версии метода.

Вы также можете изменить свое определение метода update, чтобы навсегда связать его с вашим объектом в конструкторе, добавив это в конструктор:

this.update = this.update.bind(this);
person jfriend00    schedule 23.01.2017