我想知道如何在控制器之间进行通信

时间:2017-11-04 04:03:29

标签: node.js email

当我单击电子邮件中的身份验证链接以使用电子邮件身份验证实现成员身份方法时,我想在服务器内部确认令牌后调用用户创建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的成本可能会更高。

我想知道控制器之间通信的正确模式。请记住,提出问题时只有堆栈溢出。

2 个答案:

答案 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));

这可以让您了解自己可以做些什么。您可以编写自定义中间件和类装饰器来减少样板。

答案 1 :(得分:0)

从你的问题我理解的内容: 在用户控制器中执行任何其他操作之前,您希望在内部验证在查询参数中传递的令牌。

我相信你正在使用快递,快递来middlewares

来自docs:

  

中间件函数是可以访问请求对象(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    
}