2017-01-23 7 views
1

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

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) 
     }) 
    } 

enter image description here

Это чувство, что я что-то фундаментальное отсутствует. Я слышал, что это не очень хороший образец, поэтому, пожалуйста, не стесняйтесь предлагать лучший способ. Большое спасибо заранее.

UPDATE: Это обновление используется. Я не подозреваю, что есть какие-либо проблемы здесь, как он работал нормально, когда я был импортирование контроллера в качестве функции из другого модуля, вместо класса

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 
+0

как вы «исполнение» обновление? –

+0

Это функция, переданная в экспресс-маршрут. –

+0

проблема заключается в том, что 'this' в вызове обновления, возможно, не определено? попробуйте 'console.log (this)' в верхней части обновления, чтобы увидеть, что это –

ответ

1

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

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

к этому:

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

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

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

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

this.update = this.update.bind(this);