2017-04-20 60 views
0

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

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

+0

我建议你为每个服务创建一个模块,例如注册模块,产品模块,订单模块,而不是在db模块内部。 DB模块应该是这些服务的依赖关系,而不是持有者。应该有一个层次结构,如:controller - > service - > database |加密,通常低于水平不知道以上的水平。记住一个模块组的功能。 –

回答

0

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

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

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

喜欢的东西:

控制器/ 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或关系数据库上执行数据库实现。

+0

当存在db.save时,db是否还会保存保存功能和其他功能,使它再次成为持有者? – Nullha

+0

如果我想交换数据库实现或函数,那么我不需要更改实现中每个服务模块中的代码? – Nullha

+0

那么,为了我的观点,服务被用来协调与用户创建相关的活动,如用户字段验证,用户对象创建,密码加密和数据库持久性。也许而不是调用数据库来保存,你只需要导入你的模式对象(从mongo或关系数据库),然后坚持对象。 –