2017-12-20 13 views
0

最近nodejsのes6クラスでプロジェクトコード構造を更新しようとしました。ここでエクスプレスルータのリクエストでes6クラスの状態を維持する

は、コントローラクラスが

class TaskController { 
    constructor(io, redisClient) { 
     this.socket = io; 
     this.redisClient = redisClient; 
    } 

    create(req, res) { 

     let taskDetails = req.body; 

     taskDetails.owner = req.user.id; 

     let errorFields = Validation.validate(taskDetails, [ 
      { name: 'title', type: 'text' } 
     ]); 

     if (errorFields.length > 0) { 
      return ErrorHandler.handleError(res, errorFields); 
     } 

     ...` 
    } 
    } 

ように見えるものです。ここでルートが

module.exports = (app, io, redisClient) => { 
    let taskController = new TaskController(io, redisClient); 

    router.post('', middlewares.isAuthorized('task:create'), taskController.create); 

    app.use('/api/tasks', middlewares.isAuthenticated(), router); 
    }; 

APIを作成して当たっている間に問題をファイルに私はクラスを初期化しています方法ですこのオブジェクトは、create関数では未定義です。

少しデバッグして、ルートを登録するときにコンストラクタが呼び出されることがわかりました。

ただし、taskControllerは、実際にcreate関数が呼び出されたときにコンテキストを失います。

どうすればこの構造で動作させることができますか? module.exportingすべての関数タスクコントローラに戻す必要がありますか?

答えて

0

バインドメソッドを使用してコンテキストをバインドできます。一方、create関数を渡します。

router.post('', middlewares.isAuthorized('task:create'), taskController.create.bind(taskController)); 

作成メソッドは、ポストメソッドによって異なるスコープで呼び出されているため、コンテキストが失われています。

関数を返すbindメソッドを使用してコンテキストをバインドし、その関数をメソッドを作成するために渡すことができます。

+0

さて、これはうまくいきますが、どのようにコンテキストが失われているのか説明してください。私はバインドの仕組みを知っていますが、ここではcontextControllerがどのようにコンテキストを失うのか分かりません。ルートはアプリケーションの実行時間ごとに一度だけ登録され、登録時にはtaskControllerが良好です。 –

+1

あなたはそのコンテキスト内でコールバックを実行するisAuthorizedメソッドにtaskController.createの参照を渡していたので、これはtaskControllerの代わりにisAuthorizedのコンテキストを参照します –

+0

これを参照してください:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Function/bind –

関連する問題