2017-11-04 87 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

相關問題