我试图让模块对我正在使用的其他模块知之甚少。 例如,我管理用户创建的控制器将采用数据库模块并使用它来创建用户。它将首先解析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。
答案 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或关系数据库上实现数据库实现。