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 相关文章推荐
javascript 得到变量类型的函数
May 19 Javascript
jquery 学习之二 属性 文本与值(text,val)
Nov 25 Javascript
javascript闭包的理解
Apr 01 Javascript
jquery中$each()方法的使用指南
Apr 30 Javascript
js下拉选择框与输入框联动实现添加选中值到输入框的方法
Aug 17 Javascript
详解JavaScript基本类型和引用类型
Dec 09 Javascript
Javascript生成全局唯一标识符(GUID,UUID)的方法
Feb 27 Javascript
Javascript的表单验证-揭开正则表达式的面纱
Mar 18 Javascript
详解微信小程序缓存--缓存时效性
May 02 Javascript
vue项目前端知识点整理【收藏】
May 13 Javascript
vue 强制组件重新渲染(重置)的两种方案
Oct 29 Javascript
分享JS表单验证源码(带错误提示及密码等级)
Jan 05 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输出控制功能在简繁体转换中的应用
2006/10/09 PHP
收藏的PHP常用函数 推荐收藏保存
2010/02/21 PHP
基于PHP技术开发客服工单系统
2016/01/06 PHP
laravel框架关于搜索功能的实现
2018/03/15 PHP
PHP实现基于PDO扩展连接PostgreSQL对象关系数据库示例
2018/03/31 PHP
php使用curl伪造来源ip和refer的方法示例
2018/05/08 PHP
JS中彻底删除JSON对象组成的数组中的元素
2020/09/22 PHP
jQuery密码强度检测插件passwordStrength用法实例分析
2015/10/30 Javascript
理解JavaScript事件对象
2016/01/25 Javascript
原生javascript 学习之js变量全面了解
2016/07/14 Javascript
JS实现鼠标滑过显示边框的菜单效果
2016/09/21 Javascript
新手学习前端之js模仿淘宝主页网站
2016/10/31 Javascript
php main 与 iframe 相互通讯类(js+php同域/跨域)
2017/09/14 Javascript
Vue中如何实现proxy代理
2018/04/20 Javascript
原生JS实现的简单小钟表功能示例
2018/08/30 Javascript
微信小程序实现文件、图片上传功能
2020/08/18 Javascript
layui异步加载table表中某一列数据的例子
2019/09/16 Javascript
Python实现拷贝多个文件到同一目录的方法
2016/09/19 Python
python中如何使用正则表达式的集合字符示例
2017/10/09 Python
对IPython交互模式下的退出方法详解
2019/02/16 Python
Python values()与itervalues()的用法详解
2019/11/27 Python
django框架基于queryset和双下划线的跨表查询操作详解
2019/12/11 Python
Python面向对象原理与基础语法详解
2020/01/02 Python
python算的上脚本语言吗
2020/06/22 Python
Python爬虫爬取糗事百科段子实例分享
2020/07/31 Python
Selenium webdriver添加cookie实现过程详解
2020/08/12 Python
美国家庭鞋店:Shoe Sensation
2019/09/27 全球购物
伦敦香水公司:The London Perfume Company
2019/11/13 全球购物
有影响力的人、名人和艺术家的官方商品:Represent
2019/11/26 全球购物
服务员岗位责任制
2014/02/11 职场文书
《蓝色的树叶》教学反思
2014/02/24 职场文书
应用心理学专业求职信
2014/08/04 职场文书
求职信内容一般写什么?
2015/03/20 职场文书
小学二年级班主任工作经验交流材料
2015/11/02 职场文书
2016优秀青年志愿者事迹材料
2016/02/25 职场文书
总结Python连接CS2000的详细步骤
2021/06/23 Python