Node.js连接Sql Server 2008及数据层封装详解


Posted in Javascript onAugust 27, 2018

本文实例讲述了Node.js连接Sql Server 2008及数据层封装。分享给大家供大家参考,具体如下:

最近需要学习Node.js,所以很久没写东西了,疯狂的看了很久的书。有关于Node.js的学习知识,可以参考官网教程WWW.NODEJS.ORG,或者书籍《Node.js权威指南》。这里我记录一下Node.js连接Sql Server 2008的步骤。

Node.js连接数据库需要特定的模块msnodesql,这个模块需要特定的环境去生成才可以使用。

前期准备如下:

1.安装Node.js(官网上下载)
2.安装node-gyp(安装好node.js后进入到npm目录,执行npm install node-gyp)
3.安装python 2.7.x(WWW.PYTHON.ORG上可以下载,注意下载2.7.X版本)
4.安装Visual C++ 2010 (vs2010中必须有C++模块,也可以单独下载Microsoft)
5.安装SQL Server Native Client 11.0(http://www.microsoft.com/en-us/download/details.aspx?id=29065

这些全部安装好后,就搭建好了生成msnodesql模块的环境,现在可以去官网的module上下载msnodesql模块了(注意利用npm intsall msnodesql也可以安装,但是我是win7 64执行这么命令总是不能正确安装,所以我手动下载了),下载时注意msnodesql的版本和node.js的版本对应。将下载好的msnodesql文件夹复制到node.js的node_modules路径下,然后生成步骤如下:

1.node-gyp configure

2.node-gyp build node-gyp build --debug(前者是release版)

如果生成成功的话,你的msnodesql底下会出现用Visual C++2010生成后的许多工程项目文件。node.js虽然是纯javascript代码,但大部分功能只是封装成了JS脚本,许多底层的实现其实是C/C++,就好比这个msnodesql模块,里面就有很多CPP文件,所以需要生成为VC项目。

测试:

新建文件test.js:

var obj=require('msnodesql');
console.log(obj);

coby到node.exe目录下,执行node test

若不出意外则会打印msnodesql的对外接口属性。若不能正确输出,则

1.说明msnodesql安装失败或者环境美搭建好,检查上面的安装和生成步骤。

2.说明msnodesql路径没设置好:node.exe会默认去搜索node_module文件下的模块,而msnodesql本身也是一个模块,一个模块的属性是由.json来设定的,检查.json的main属性,看是否是 "main": "./lib/sql.js",sql.js才是monodesql的入口。

最后附一段操作数据库的demo作为参考:

var sql=require('msnodesql');
var conn_str="Driver={SQL Server Native Client 11.0};Server={.};Database={nodetest};uid=sa;PWD=123456;";
sql.open(conn_str, function (err, conn) {
    if (err) {
      console.log('发生错误');
    }
    sql.queryRaw(conn_str, "select * from users", function (err, results) {
      if (err) {
        console.log(err);
      }
      else {
        for (var i = 0; i < results.rows.length; i++) {
          console.log(results.rows[i][0] + results.rows[i][1]);
        }
      }
    })
  })

Nodejs连接sqlserver数据层封装

前面简单介绍了nodejs连接sqlserver,接下来介绍将所有数据库操作封装起来,方便项目调用的方法。

思路:所有配置参数写入xml文件,数据库操作封装起来,外部只暴露增删改查方法,方法参数只需要sql语句。

1.nodejs读取xml文件

nodejs解析xml文件需要模块libxmljs,安装:nmp install libxmljs

config.xml文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <mydb driver="SQL Server Native Client 11.0" server="XXX" database="XXX" user="XXX" pwd="XXX">
    <table name="FelixTest" />
  </mydb>
</root>

建立operateXML.js:

/*
Author:
  Felix.X.Zhang
Date:
  2014-6-19
Introduction:
  this module provides you with the operations (read) of xml file.
*/
//Async Method
/*
   var libxmljs=require('libxmljs');
   var fs=require('fs');
   var path='./config.xml';
   var param=new params();
   fs.readFile(path, 'utf8', function(err, data) { 
   if (err) throw err;
   var xmlDoc = libxmljs.parseXmlString(data);
   // xpath queries
   var mydb = xmlDoc.get('//mydb');
   var table=xmlDoc.get('//mydb//table');
   param.mydb_server=mydb.attr('server').value();
   param.mydb_database=mydb.attr('database').value();
   param.mydb_user=mydb.attr('user').value();
   param.mydb_pwd=mydb.attr('pwd').value();
   param.table_name=table.attr('name').value();
  }); 
*/
function params(){
  this.mydb_driver="";
  this.mydb_server="";
  this.mydb_database="";
  this.mydb_user="";
  this.mydb_pwd="";
  this.table_name="";
}
function getParamObj(){
   var libxmljs=require('libxmljs');
     var fs=require('fs');
   var path='./config1.xml';
   var param=new params();
   var data;
   try{
     data= fs.readFileSync(path, 'utf8');
   }
   catch(err){
     throw err;
   }
   var xmlDoc = libxmljs.parseXmlString(data);
   var mydb = xmlDoc.get('//mydb');
   var table=xmlDoc.get('//mydb//table');
   param.mydb_driver=mydb.attr('driver').value();
   param.mydb_server=mydb.attr('server').value();
   param.mydb_database=mydb.attr('database').value();
   param.mydb_user=mydb.attr('user').value();
   param.mydb_pwd=mydb.attr('pwd').value();
   param.table_name=table.attr('name').value();
   //console.log(param.mydb_server+" "+param.table_name);
   return param;
}
exports.getParamObj=getParamObj;

方法很简单,同步读取xml文件后利用libxml模块将data解析为对象,最后将所有属性全部封装到param中。(异步读取参考上面注释段)

2.dbHelper.js

/*
Author:
  Felix.X.Zhang
Date:
  2014-6-21
Introduction:
  this module provides you with the operations of add,del,update,select.
*/
//pre-required params
var sql = require('msnodesql');
var xml=require('../mymodule/operateXML.js');
var paramObj=xml.getParamObj();
var conn_str="Driver={"+paramObj.mydb_driver+"};Server={"+paramObj.mydb_server+"};Database={"+paramObj.mydb_database+"};uid="+paramObj.mydb_user+";PWD="+paramObj.mydb_pwd+";";
//open database
sql.open(conn_str, function (err, conn) {
    if (err) {
      console.log(err);
    }
});
function exeScript(sqlscript){
  sql.queryRaw(conn_str, sqlscript, function (err, results) {
        if (err) {
          console.log(err);
        }
        else {
          console.log(results);
        }
      });
}
function select(sqlscript){
  sql.queryRaw(conn_str, sqlscript, function (err, results) {
        if (err) {
          console.log(err);
        }
        else {
          var txt=toJson(results,paramObj.table_name);
          var jsonObj=eval("("+txt+")");
          console.log(jsonObj);
        }
      });
}
function del(sqlscript){
  exeScript(sqlscript);
}
function update(sqlscript){
  exeScript(sqlscript);
}
function add(sqlscript){
  exeScript(sqlscript);
}
//convert table to json
function toJson(dt,tbName) 
  {
    var jsonString;
    if (dt != undefined && dt.rows.length > 0)
    {
      var rowLen=dt.rows.length;
      var colLen=dt.meta.length;
      jsonString="{";
      jsonString+="\""+tbName+"\":[";
      for (var i = 0; i < rowLen; i++)
      {
        jsonString+="{";
        for (var j = 0; j < colLen; j++)
        {
          if (j < colLen - 1)
          {
            jsonString+="\"" + dt.meta[j].name + "\":" + "\"" + dt.rows[i][j]+ "\",";
          }
          else if (j == colLen - 1)
          {
            jsonString+="\"" + dt.meta[j].name + "\":" + "\"" + dt.rows[i][j] + "\"";
          }
        }
        if (i == rowLen - 1)
        {
          jsonString+="}";
        }
        else
        {
          jsonString+="},";
        }
      }
        jsonString+="]}";
        return jsonString;
    }
    return jsonString;
  }
exports.add=add;
exports.del=del;
exports.update=update;
exports.select=select;

封装的db层也很简单,只有select输出json,其他只执行。

3.测试

var db=require('./dbHelper.js');
db.select("select top 10 * from FelixTest");

当然了,在实际项目中可以在调用中间加一个bll层,让具体的业务逻辑去生成sql脚本,前台不需要去组装sql,而db层也只要sqlscript。

希望本文所述对大家nodejs程序设计有所帮助。

Javascript 相关文章推荐
Discuz! 6.1_jQuery兼容问题
Sep 23 Javascript
validator验证控件使用代码
Nov 23 Javascript
Javascript图像处理—为矩阵添加常用方法
Dec 27 Javascript
jQuery对html元素取值与赋值的方法
Nov 20 Javascript
window.open()详解及浏览器兼容性问题示例探讨
May 29 Javascript
transport.js和jquery冲突问题的解决方法
Feb 10 Javascript
JavaScript的类型、值和变量小结
Jul 09 Javascript
jQuery bt气泡实现悬停显示及移开隐藏功能的方法
Jul 12 Javascript
JS验证码实现代码
Sep 14 Javascript
深入浅出理解JavaScript高级定时器原理与用法
Aug 02 Javascript
vue 根据选择条件显示指定参数的例子
Nov 09 Javascript
Vue插槽_特殊特性slot,slot-scope与指令v-slot说明
Sep 04 Javascript
解决vue中修改export default中脚本报一大堆错的问题
Aug 27 #Javascript
vue.js 图片上传并预览及图片更换功能的实现代码
Aug 27 #Javascript
JS常见构造模式实例对比分析
Aug 27 #Javascript
Vue.js图片预览插件使用详解
Aug 27 #Javascript
JavaScript中创建原子的方法总结
Aug 26 #Javascript
解决vue.js 数据渲染成功仍报错的问题
Aug 25 #Javascript
解决Vue.js由于延时显示了{{message}}引用界面的问题
Aug 25 #Javascript
You might like
PHP中break及continue两个流程控制指令区别分析
2011/04/18 PHP
Zend Framework教程之Zend_Db_Table用法详解
2016/03/21 PHP
JSON JQUERY模板实现说明
2010/07/03 Javascript
JavaScript经典效果集锦
2010/07/06 Javascript
JS函数重载的解决方案
2014/05/13 Javascript
javascript实现瀑布流自适应遇到的问题及解决方案
2015/01/28 Javascript
JavaScript中函数(Function)的apply与call理解
2015/07/08 Javascript
js实现的星星评分功能函数
2015/12/09 Javascript
微信小程序 合法域名校验出错详解及解决办法
2017/03/09 Javascript
JavaScript使用readAsDataUrl方法预览图片
2017/05/10 Javascript
VSCode配置react开发环境的步骤
2017/12/27 Javascript
vue 组件中使用 transition 和 transition-group实现过渡动画
2019/07/09 Javascript
解决Vue 移动端点击出现300毫秒延迟的问题
2020/07/21 Javascript
Vue-cli打包后部署到子目录下的路径问题说明
2020/09/02 Javascript
CentOS 6.X系统下升级Python2.6到Python2.7 的方法
2016/10/12 Python
对python csv模块配置分隔符和引用符详解
2018/12/12 Python
Pyecharts绘制全球流向图的示例代码
2020/01/08 Python
Python爬虫获取页面所有URL链接过程详解
2020/06/04 Python
Django视图、传参和forms验证操作
2020/07/15 Python
python 用pandas实现数据透视表功能
2020/12/21 Python
html5如何及时更新缓存文件(js、css或图片)
2013/06/24 HTML / CSS
美国最大的宠物用品零售商:PetSmart
2016/11/14 全球购物
Columbia美国官网:美国著名的户外服装品牌
2016/11/24 全球购物
Myholidays美国:在线旅游网站
2019/08/16 全球购物
介绍一下Make? 为什么使用make
2016/07/31 面试题
酒店总经理工作职责
2013/12/13 职场文书
烹饪自我鉴定
2014/03/01 职场文书
英文自荐信常用句子
2014/03/26 职场文书
四年级学生评语大全
2014/04/21 职场文书
环境工程专业自荐信范文
2014/06/24 职场文书
机械专业求职信范文
2014/07/15 职场文书
行政工作试用期自我评价
2014/09/14 职场文书
县委务虚会发言材料
2014/10/20 职场文书
先进单位申报材料
2014/12/25 职场文书
医院保洁员岗位职责
2015/02/13 职场文书
道歉情书大全
2015/05/12 职场文书