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

相关问题