【问题标题】:How much knowledge does a module needs to have about the project一个模块需要多少关于项目的知识
【发布时间】:2017-04-20 15:58:46
【问题描述】:

我试图让模块对我正在使用的其他模块了解更少。 例如,我管理用户创建的控制器将采用数据库模块并使用它来创建用户。它将首先解析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。

【问题讨论】:

  • 我建议你为你拥有的每个服务创建一个模块,例如注册模块、产品模块、订单模块,而不是在 db 模块中。 DB 模块应该是这些服务的依赖项,而不是持有者。应该有一个层次结构,如:控制器 -> 服务 -> 数据库 |加密,通常低于级别不知道高于级别。记住一个模块组的功能。

标签: node.js architecture software-design


【解决方案1】:

我建议您为您拥有的每个服务创建一个模块,例如注册模块、产品模块、订单模块,而不是在 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'});
}

service/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');
            });
        }
    }
}

models/user.js

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

【讨论】:

  • 当有db.save的时候,db不也同时拥有save函数和其他函数,让它再次成为一个持有者吗?
  • 如果我想交换db实现或函数,那我不是必须在你的实现中更改每个服务模块中的代码吗?
  • 好吧,在我看来,服务用于协调与用户创建相关的活动,例如:用户字段验证、用户对象创建、密码加密和数据库持久性。也许不需要调用数据库来保存,您只需要导入您的模式对象(从 mongo 或关系数据库中),然后持久化该对象。
猜你喜欢
  • 1970-01-01
  • 2011-08-27
  • 2012-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-05
相关资源
最近更新 更多