NodeJS模块模式

时间:2013-06-17 10:55:52

标签: node.js design-patterns module

我即将开始为我正在开发的系统编写一个新模块。我们使用MySQL数据库(所以我使用的是node-mysql),其中包含customers表。

我想要实现的目标是:

  • 在模块之外,我希望var C = new Customer(1) 1是客户ID。
  • 现在,当我想从这位客户那里得到一些东西时,我可以C.emailC.first_name只返回一个值。
  • 我还需要能够在此客户C.email = 'example@example.com'上设置值,或者可能:

    C.set('email', 'example@example.com')

创建这样一个模型的最佳模式是什么?

2 个答案:

答案 0 :(得分:0)

我已经有类似的东西...不完全是你要求但非常接近的 我已经概括了核心部分,这里是代码。希望这会有所帮助......

var mysql = require('mysql');
var con = mysql.createConnection({
host:"yourHostName",
user:"yourUserName",
password:"yourPassword"
});
con.query("use databaseName");
function getCustomerDetails(custId){
con.query("select * from customer where custId = "+custId,function(err,result,fields){
if(!err)
    return result;
else
    console.log(err);
});
}
function updateCustomerDetails(custId,fieldName,fieldValue){
con.query("update customer set "+fieldName+" = "+fieldValue+" where custId =       "+custId,function(err,result,fields){
    if(!err)
        return true;
    else
        console.log(err);
        return false;
});
}
exports.getCustomerDetails = getCustomerDetails;
exports.updateCustomerDetails = updateCustomerDetails;

然后假设您将模块保存为dbAccessModule.js然后您可以使用这样的函数

var C = require('./dbAccessModule');
result = C.getCustomerDetails(1);
console.log(result.fieldName);

var success = C.updateCustomerDetails(1,'name','sumit');         
if(success)
console.log('Table Updated successfully....');
else
// take necessary action according to your application

您需要注意的一件事是,如果您使用字符串值更新任何字段 那么请不要忘记用单引号括起fieldValue的值。

如果这不是您要求的,请忽略它....

答案 1 :(得分:0)

我最近创建了两个数据库模块,您可能有兴趣查看它们是否符合您的需求 - 一个ORM:http://bookshelfjs.org和查询构建器:http://knexjs.org

ORM基于Backbone.js的设计模式

所以,你可以做这样的事情:

// Create the base customer object
var Customer = Bookshelf.Model.extend({
  tableName: 'customers'
});

// Create a new customer instance with an id of 1, fetch it, and then
// act on the result model 'customer'.
new Customer({id: 1}).fetch().then(function(customer) {
  console.log(customer.get('name'))
  customer.set('email', 'email@example.com')
  return customer.save();
});

您还可以扩展基础Customer类以启用缩写语法,类似于您要查找的内容:

// Create the base customer object, with a static findOne method.
var Customer = Bookshelf.Model.extend({
  tableName: 'customers'
}, {
  find: function(id) {
    return new this({id: id}).fetch();
  }
});

Customer.find(1).then(function(C) {
   console.log(C.get('name'))
   C.set('email', 'email@example.com')
});