本文实例讲述了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虽然是纯 代码,但大部分功能只是封装成了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={.};Data ={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,接下来介绍将所有数据库操作封装起来,方便项目调用的方法。
思路:所有配置参数写入 文件,数据库操作封装起来,外部只暴露增删改查方法,方法参数只需要sql语句。
1.nodejs读取 文件
nodejs解析 文件需要模块lib js,安装:nmp install lib js
config. 文件如下:
<? version="1.0" encoding="UTF-8"?>
<root>
<mydb driver="SQL Server Native Client 11.0" server="XXX" data ="XXX" user="XXX" pwd="XXX">
<table name="FelixTest" />
</mydb>
</root>
建立operate .js:
/*
Author:
Felix.X.Zhang
Date:
2014-6-19
Introduction:
this module provides you with the operations (read) of file.
*/
//Async Method
/*
var lib js=require('lib js');
var fs=require('fs');
var path='./config. ';
var param=new params();
fs.readFile(path, 'utf8', function(err, data) {
if (err) throw err;
var Doc = lib js.parse String(data);
// xpath queries
var mydb = Doc.get('//mydb');
var table= Doc.get('//mydb//table');
param.mydb_server=mydb.attr('server').value();
param.mydb_data =mydb.attr('data ').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_data ="";
this.mydb_user="";
this.mydb_pwd="";
this.table_name="";
}
function getParamObj(){
var lib js=require('lib js');
var fs=require('fs');
var path='./config1. ';
var param=new params();
var data;
try{
data= fs.readFileSync(path, 'utf8');
}
catch(err){
throw err;
}
var Doc = lib js.parse String(data);
var mydb = Doc.get('//mydb');
var table= Doc.get('//mydb//table');
param.mydb_driver=mydb.attr('driver').value();
param.mydb_server=mydb.attr('server').value();
param.mydb_data =mydb.attr('data ').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;
方法很简单,同步读取 文件后利用lib 模块将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 =require('../mymodule/operate .js');
var paramObj= .getParamObj();
var conn_str="Driver={"+paramObj.mydb_driver+"};Server={"+paramObj.mydb_server+"};Data ={"+paramObj.mydb_data +"};uid="+paramObj.mydb_user+";PWD="+paramObj.mydb_pwd+";";
//open data
sql.open(conn_str, function (err, conn) {
if (err) {
console.log(err);
}
});
function exe (sql ){
sql.queryRaw(conn_str, sql , function (err, results) {
if (err) {
console.log(err);
}
else {
console.log(results);
}
});
}
function select(sql ){
sql.queryRaw(conn_str, sql , 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(sql ){
exe (sql );
}
function update(sql ){
exe (sql );
}
function add(sql ){
exe (sql );
}
//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. .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. [j].name + "\":" + "\"" + dt.rows[i][j]+ "\",";
}
else if (j == colLen - 1)
{
jsonString+="\"" + dt. [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层也只要sql 。
希望本文所述对大家nodejs程序设计有所帮助。
继续阅读与本文标签相同的文章
-
最新115道华为、京东、滴滴、美团精选Java面试题整理
2026-05-18栏目: 教程
-
吴伯凡:谁在重新定义我们的城市
2026-05-18栏目: 教程
-
阿里巴巴集团副总裁郭继军:智慧城市建设如何不变成房地产项目
2026-05-18栏目: 教程
-
阿里云RDS for SQL Server购买使用流程
2026-05-18栏目: 教程
-
阿里云智能战略与合作部刘湘雯:阿里关于创新创业服务的思考
2026-05-18栏目: 教程
