模块需要对项目了解多少知识

时间:2017-04-20 15:58:47

标签: node.js architecture software-design

我试图让模块对我正在使用的其他模块知之甚少。 例如,我管理用户创建的控制器将采用数据库模块并使用它来创建用户。它将首先解析req中的细节,然后将其传递给数据库模块,调用一个特定的函数。

registerController.postUser =  function(req, res, next){
    email = req.body.email;
    password = req.body.psw;
    var pswHash = crypto.createHmac('sha256',secret).update(password).digest('hex');
    db.register.createUser(email,pswHash);
}

在这种情况下,控制器模块知道我的db模块有一个.register.creatuser函数。如果我想更改数据库模块的组织,我将不得不修改这部分代码。你认为这是足够的分离还是没有?我应该单独传递函数而不是整个db模块,例如,使上面的代码再接受一个createUser函数的参数,并使用它而不是db.register.createUser。

1 个答案:

答案 0 :(得分:0)

我建议你为每个服务创建一个模块,例如注册模块,产品模块,订单模块,而不是在db模块中。然后实现数据库模块应该是那些服务的依赖,而不是持有者。

应该有一个层次结构,如:controller - >服务 - >数据库模型|加密,通常低于水平不知道上述水平。记住一个模块分组功能。

服务将保留每个活动背后的逻辑,并根据服务结果控制重定向逻辑。

类似的东西:

<强>控制器/ register.js

var register = require('./service/register');

registerController.postUser =  function(req, res, next){
    email = req.body.email;
    password = req.body.psw; 
    try {
        register.createUser(email,pasword);
    } catch(e) {
       // Handle email and password validation error
       // Handle attempting to create a record for existent user
       // Others
       res.render('singup?error', { message: 'There was an error!' });
    }

    //successfull implementarion
    res.render('login', { message: 'User registered successfully! Please login'});
}

<强>服务/ register.js

var crypto = require('...');
var User = require('...');

module.exports = {
    createUser: function(email, psw) {
        // Validating fields
        if(email == undefined || psw === undefined)
           throw new Error('Field not valid');
        //Validating existance
        if(User.findByEmail(email) == undefined) {
            // Encrypting password
            var pswHash = crypto.createHmac('sha256',secret).update(password).digest('hex');
            //Create the user object 
            var user = new User({
               email: email,
               encryptedPassword: pswHash
            });
            // Save object
            user.save().then(function(user) {
              console.log('User created successfully');
            });
        }
    }
}

<强>模型/ user.js的

您可以在mongo或关系数据库上实现数据库实现。