2017-01-23 6 views
1

コンストラクタのクラスから新しいオブジェクトを作成していますが、実行するたびに、コンストラクタで定義されていても操作が定義されていないというエラーが発生します。操作自体は徹底的にテストされており、別の状況でうまく動作するので問題はありません。私は基本的な何かが欠けてるように感じている。これは、ノード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) 
     }) 
    } 

enter image description here

に直接それを実行しているない、バベルでそれを構築しています。とにかくこれは素晴らしいパターンではないと聞きましたので、より良い方法を提案してください。事前にありがとうございます。

更新:これは更新の使用方法です。

router.post("/", controller.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

クラスの代わりに、ここに問題があります。このからの変更を疑っていませんあなたが controller.updateを渡すと

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

それが唯一の方法へのポインタを渡され、controllerオブジェクトと任意の関連付けが失われます。これに

。その後、そのupdateメソッドが後で呼び出されるとき、適切なオブジェクトとの関連付けがないため、メソッドのthisハンドラが間違っていて、あなたが見ていたエラーが発生します。

updateメソッドのバインドをオブジェクト内に強制するか、正しく呼び出されない可能性がある別の場所でメソッドを渡す場合は、上記の構造を使用してメソッドのバインドされたバージョンを渡すことができます。

また、恒久的にコンストラクタにこれを追加することにより、コンストラクタで、あなたのオブジェクトにバインドするupdate方法のあなたの定義を変更できます。

this.update = this.update.bind(this); 
関連する問題