2017-11-04 5 views
1

電子メール認証を使用してメンバーシップメソッドを実装するために、電子メール内の認証リンクをクリックすると、サーバーでトークンを内部的に確認した後でユーザー作成APIを呼び出します。私はコントローラ間で通信する方法を考えています

//emailcontroller.js 
router.get('/register/token', function(req, res) { 
    // check token 

    if(check(req.params.token)) { 
     request('http://localhost:8080/api/user', function(data) { 

     }); 
    } 
}); 

//usercontroller.js 
router.post('/api/user', function(req, res) { 
    var user = new User(); 
    user.userId = req.body.userId; 
    user.userPw = req.body.userPw; 

    user.save(); 
}); 

私は、電子メール認証を使用してメンバーシップの方法を実施するために、電子メールでの認証リンクをクリックしたときに、サーバーの内部でトークンを確認した後、ユーザー作成APIを呼び出すようにしたいです。

上記のように、電子メールコントローラとユーザーコントローラは分割され、それぞれがルーティングされます。私はコードをモジュール化して、既存のユーザー作成APIを呼び出して、特定のコントローラーの共通関数を作成してエクスポートするのではなく、汎用目的で使用したいと考えています。

/*I do not want to implement it this way.*/ 
//emailController.js 
router.get('/register/token', function(req, res) { 
    // check token 

    if(check(req.params.token)) { 
     userContoller.createUserFromEmail(userId, userPw); 
    } 
}); 

//userController.js 
exports.createUserFromEmail = function(userId, userPw) { 
    var user = new User(); 
    user.userId = userId; 
    user.userPw = userPw; 

    user.save(); 
} 

しかし、私は多くの例でコントローラ間の通信を見たことがありません。だから、私が正しいと思った方法が正しいかどうかわからない。むしろ、私はサーバー上でAPIを内部的に呼び出すコストが高くなるかもしれないと思います。

コントローラ間の正しい通信パターンを知りたい。質問をするときは、スタックのオーバーフローしかないことに注意してください。

+0

あなたは、もしかして、あなたは利用者を呼び出したい/ルートを作成しますか? あなたの質問は不透明です。説明してください –

答えて

1

API機能をスタンドアロン関数(またはクラス)として公開することについて、適切なアイデアがあります。重複を避けるために、ルートハンドラ内から内部メソッドを呼び出すだけです。あなたの例では:

router.post('/api/user', function(req, res) { 
    createUserFromEmail(req.body.userId, req.body.userPw); 
}); 

自分のプロジェクトでは、自分のAPIを作成するためにクラスを使用します。まず、私はちょうど機能を持つクラスを定義してから、私はルートハンドラのメソッドを公開:

export default class User { 

    read() { 

    } 

    create() { 

    } 

    update() { 

    } 

    delete() { 

    } 
} 

const user = new User(); 

router.get('/user/:id', (req, res) => user.read(req.params.id)); 

router.post('/user', (req, res) => user.create(req.body.data)); 

router.put('/user/:id', (req, res) => user.update(req.params.id, req.body.data)); 

router.delete('/user/:id', (req, res) => user.delete(req.params.id)); 

これはあなたが何ができるかのアイデアを与える必要があります。定型文を減らすために、カスタムミドルウェアとクラスデコレータを記述することができます。

+0

うわー!ありがとうございました!! – HungryBird

0

あなたの質問から理解してください: ユーザコントローラ内の他の操作を行う前に、クエリパラメータで渡されたトークンを内部的に検証する必要があります。

私はあなたが急行を使用していると信じており、急行はmiddlewaresとなります。ドキュメントから

ミドルウェア機能は、リクエストオブジェクト(REQ)、応答オブジェクト(RES)、およびアプリケーションの要求応答サイクルの次のミドルウェア機能へのアクセス権を持つ関数です。次のミドルウェア機能は、通常、nextという名前の変数で表されます。

私が通常やっていることは一般的には良いことですが、create user apiにトークンを渡してメール本文に添付してください。例えば

api/user?token=somerandomstringloremispum

ルートファイル:

router.post('/user', validateEmail, userController.create);

ここvalidateEmailmiddleware関数であり、userControllerのメソッドを作成する前に呼び出されます。

は、今すぐあなたのvalidateToken方法では、単にあなたのトークンなどを検証することができます。ユーザーが電子メール内のリンクをクリックしたときに

function validateEmail (req, res, next) { 
    if(!valid(req.query.token)) { 
     //return with appropriate invalid token msg using res.json() or however you like 
    } 

    // if validated call `next middleware` like so: 
    next(); 
    // this will allow `create` method of userController be invoked  
} 
+0

ありがとうございます! – HungryBird

関連する問題