Node与Mysql交互
采用node-mysql开源项目作为Node框架的MySQL扩展库包括以下方面:
1. 连接MySQL数据库操作
2. 查询MySQL数据库操作
3. 修改MySQL数据库操作
4. 插入MySQL数据库操作
5. 删除MySQL数据库操作
6. MySQL数据库连接池
连接MySQL数据库操作
console.info("------ mysql connetion() ------");
console.info();
var http = require("http"); // 引入HTTP模块
var mysql = require("/usr/local/lib/node_modules.mysql"); // 引入mysql模块
console.log("Now start HTTP server on port 6868...");
console.info();
/**
* 创建数据库连接
*/
var connection = mysql.createConnection({
host: "localhoset", // 主机地址
user: "root", // 数据库用户名
password: "root", // 数据库密码
database: "nodejs", // 数据库名称
port: 3306 // 端口号
});
/**
* 创建HTTP服务器
*/
http.createServer(function(req, res) {
res.writeHead(200, {"Content-Type": "text/html;charset=utf8"});
res.write("<h3>测试 Node.js-MySQL 数据库;连接!</h3><br/>");
/**
* 测试数据库连接
*/
connection.connect(function(err) {
if(err) {
res.end("<p>Error Connected to MySQL!</p>");
return;
} else {
res.end('<p>Connected to MySQL!</p>');
}
});
}).listen(6868); // 监听6868端口号
查询MySQL数据库操作
console.log("------ mysql query() ------");
console.info();
var http = require("http"); // 引入HTTP模块
var mysql = require("/usr/local/lib/node_modules/mysql"); //引入mysql模块
// ......省略12行代码见上代码块对应部分
/**
* 创建HTTP服务器
*/
http.createServer(function(req, res) {
connection.query("select * from userInfo;", function(error, rows, fields) {
res.writeHead(200, {"Content-Type":text/html;charset=utf8"});
res.write("<h3>测试 Node.js-MySQL 数据库查询操作</h3><br/>");
res.end(JSON.stringify(rows));
});
}).listen(6868); // 监听6868端口号
插入MySQL数据库操作
console.log("------ mysql insert() ------");
console.info();
var http = require("http"); // 引入HTTP模块
var mysql = require("/usr/local/lib/node_modules/mysql"); //引入mysql模块
//......此处省略连接数据库代码,可参考本章节
connection.query('insert into userinfo(id, name, pwd) values(7, "genius", "12345678");',
function(errorinsert, resinsert) {
if(errorinsert) console.log(errorinsert);
console.log("INSERT Return ==> ");
console.log(resinsert);
}
);
//......此处省略连接数据库代码,可参考本章节
删除MySQL数据库操作
console.log("------ mysql delete() ------");
console.info();
var http = require("http"); // 引入HTTP模块
var mysql = require("/usr/local/lib/node_modules/mysql"); //引入mysql模块
//......此处省略连接数据库代码,可参考本章节
connection.query('delete from userinfo where id=7;', function(errordelete, resdelete) {
if(errordelete) console.log(errordelete);
console.log("DELETE Return ==>");
console.log(resdelete);
});
//......此处省略连接数据库代码,可参考本章节
更新MySQL数据库
console.log("------ mysql update() ------");
console.info();
var http = require("http"); // 引入HTTP模块
var mysql = require("/usr/local/lib/node_modules/mysql"); //引入mysql模块
//......此处省略连接数据库代码,可参考本章节
connection.query('update userinfo set pwd="87654321" where pwd="12345678";',
function(errorupdate, resupdate) {
if(errorupdate) console.log(errorupdate);
console.log("Update Return ==>");
console.log(resupdate);
}
);
//......此处省略连接数据库代码,可参考本章节
操作MySQL数据库连接池
console.log("------ mysql pool() ------");
console.info();
var http = require("http"); // 引入HTTP模块
var mysql = require("/usr/local/lib/node_modules/mysql"); //引入mysql模块
//......省略12行代码,见建立数据连接部分
/**
* 创建HTTP服务器
*/
http.createServer(function(req, res) {
/**
* 获取数据库连接池
*/
pool.getConnection(function(err, conn) {
if(err) {
console.log("POOL ==> " + err);
console.log();
}
/**
* 定义SQL查询语句
* @type {string}
*/
var selectSQL = 'select * from userinfo';
/**
* 执行数据查询操作
*/
conn.query(selectSQL, function(err, rows) {
if(err) {
console.log(err);
console.log();
}
console.log("SELECT ==> ");
for(var i in rows) {
console.log(rows[i]);
}
conn.release(); // 释放数据库连接
res.writeHead(200, {"Content-Type": "text/html;charset=utf8"});
res.write("<h3>测试 Node.js - MySQL 数据库连接池操作!</h3><br/>");
res.end(JSON.stringify(rows));
});
});
}).listen(6868); // 监听6868端口号
Node异步I/O与Async流程控制库
1. Node框架异步I/O机制
2. Node框架异步I/O应用
3. Async流程控制库
Node框架异步I/O机制基础
console.inf("/n");
console.info('------ Node异步编程:基础初步! ------');
console.inf("/n");
// 使用setTimeout()异步方法初探异步机制
setTimeout(function() {
console.log('async - print it now'); // 在回调函数内输出信息
}, 3000);
console.log("asyn - print it 3 second later!"); // 异步方法后输出信息
console.inf("/n");
console.inf("------ Node异步编程 ------");
console.inf("/n");
Node框架异常捕获机制
console.info('------ Node异步编程:异常捕获! ------');
setTimeout(function() {
try {
var data = b/0; //错误的计算
} catch(e) {
console.log(e);
}
}, 1000);
console.info();
Async串行流程控制
console.info('------ Node异步编程:Async series Array');
console.info();
var async = require("async"); // 引用'async'包
/**
* 使用series函数方法
*/
async.series([
function(callback) {
callback(null, 'hello');
},
function(callback) {
callback(null, 'async');
},
function(callback) {
callback(null, 'series');
}
], function(err, results) {
console.log(results);
});
console.info();
console.info('------ Node异步编程:Async series ------');
console.info('------ Node异步编程:Async series Json ------');
console.info();
var async = require('async'); // 引用'async'包
/**
* 使用series函数方法
*/
async.series({
one: function(callback) {
callback(null, "hello");
},
two: function(callback) {
callback(null, "async");
},
three: function(callback) {
callback(null, "series");
},
}, function(err, results) {
console.log(results);
});
console.info();
console.info('------ Node异步编程: Async series Json ------');
说明:在应用Async流程控制库过程中,async.series()函数完全严格按照串行执行的,它完成的是同步操作的功能。
Async瀑布模式流程控制(串行)
console.info('------ Node异步编程:Async waterfall ------');
console.info();
var async = require('async'); // 引用'async'包
/**
* 使用waterfall函数方法
*/
async.waterfall([
function(callback) {
// 回调函数的第一个参数为非空值时,waterfall会停止执行剩余任务
callback(null, 1);
},
function(data, callbackl) {
console.info(data);
callback(‘test’, 2);
},
function(data, callback) {
console.info(data);
callback(null, 3);
}
], function(err, results) {
console.log(results);
});
console.info();
console.info('------ Node异步编程:Async waterfall ------');
Async并行流程控制
console.info('------ Node异步编程:Async parallel ------');
console.info();
var async = require('async'); // 引用'async'包
/**
* 使用parallel函数方法
*/
async.parallel([
function(callback) {
setTimeout(function() {
callback(null, 'one');
}, 2000);
},
function(callback) {
setTimeout(function() {
callback(null, 'two');
}, 1000);
}
],
function(err, results) {
console.log(results);
});
console.info();
console.info('------ Node异步编程:Async parallel ------');
Async限制性并行流程控制
console.info('------ Node异步编程:Async parallelLimit ------');
console.info();
var async = require('async'); // 引用'async'包
/**
* 使用parallelLimit函数方法
*/
async.parallelLimit([
function(callback) {
setTimeout(function() {
callback(null, 'one');
}, 1000);
},
function(callback) {
setTimeout(function() {
callback(null, 'two');
}, 1000);
}
],
1,
function(err, results) {
console.log(results);
));
console.info();
console.info('------ Node异步编程:Async parallelLimit ------');
Async循环流程控制
console.info('------ Node异步编程:Async whilst ------');
console.info();
var async = require('async');
var count = 0;
/**
* Define JSON Array
* @type {{name:string, age:number}[]}
*/
var list = [
{name:'Jack', age:20},
{name:'Lucy', age:18},
{name:'Jack', age:20},
{name:'Lucy', age:18},
{name:'Lucy', age:18}
];
async.whilst() {
function() {
return count < 5;
},
function(callback) {
console.log(count);
list[count].age += 1;
count++;
setTimeout(callback, 1000);
},
function(err) {
console.log(count);
console.log(list);
}
};
console.info();
console.info('------ Node异步编程:Async whilst ------');
console.info('------ Node异步编程:Async doWhilst ------');
console.info();
var async = require('async');
var count = 0;
/**
* Define JSON Array
* @type {{name:string, age:number}[]}
*/
var list = [
{name:'Jack', age:20},
{name:'Lucy', age:18},
{name:'Jack', age:20},
{name:'Lucy', age:18},
{name:'Lucy', age:18}
];
async.doWhilst{
function(callback) {
console.log(count);
list[count].age += 1;
count++;
setTimeout(callback, 1000);
},
function() {return count < 5},
function(err) {
console.log(list);
}
};
console.info();
console.info('------ Node异步编程:Async doWhilst ------');
Async队列流程控制
console.info('------ Node异步编程:Async queue ------');
console.info();
var async = require('async');
/**
* 定义一个queue,设worker数量为2
*/、
var q = async.queue(function(task, callback) {
console.log('worker is processing task:', task.name);
}, 2);
/**
* 独立加入5个任务
*/
q.push({name: 'foo'}, function(err) {
console.log('finished processing foo');
});
q.push({name: 'bar'}, function(err) {
console.log('finished processing bar');
});
q.push({name: 'cap'}, function(err) {
console.log('finished processing cap');
});
q.push({name: 'egg'}, function(err) {
console.log('finished processing egg');
});
q.push({name: 'app'}, function(err) {
console.log('finished processing app');
});
/**
* listen: 当最后一个任务交给worker时,将调用该函数
*/
q.empty = function() {
console.log('no more tasks waiting');
}
/**
* listen: 当所有任务都执行完以后,将调用该函数
*/
q.drain = function() {
console.log('all tasks have been processed');
}
注意:相对于async.parallel()函数而言,async.queue()函数在很多关键点提供了回调处理,而且pusj新任务的功能也是async.parallel()函数所做不到的,由此可见async.queue()函数的并行处理能力更为强大。
Node Web开发
围绕以下方面:
1. HTTP模块方法与应用
2. HTTPS模块方法与应用
3. Express开发框架应用
构建一个基本的HTTP服务器
console.info("------ http - create basic server ------");
console.info();
var http = require('http'); // 引入http模块
/**
* 调用http.createServer()方法创建服务器
*/
http.createServer(function(req, res){
/**
* 通过res.writeHeader()方法写HTTP文件头
*/
res.writeHeader(200, {'Content-type' : 'text/html'});
/**
* 通过res.write()方法写页面内容
*/
res.write('<h3>Node.js-HTTP</h3>');
/**
* 通过res.end()方法发送响应状态码,并通知服务器消息完成
*/
res.end('<p>Create Basic HTTP Server</p>');
}).listen(6868); // 监听6868端口号
说明:当第一次调用response.write()方法时,将会发送缓存的header信息和第一个报文给客户端。当第二次调用response.write()方法时,Node框架假设用户将发送数据流,然后分别地进行发送。意味着响应是缓存到第一次报文的数据块。如果response.write()方法的所有数据被成功刷新到内核缓冲区,则返回true。如果所有或部分数据还处在队列中,则返回false。当缓冲区再次被释放时,drain事件会被分发。
编写一个简单的HTTP客户端
console.info('------ http-create basic client ------');
console.info();
var http = require('http'); // 引入http模块
/**
* 定义服务器参数字段
* @type {{hostname: string, port: number, path: string, method: string}}
*/
var options = {
hostname: 'localhost', // 定义服务器主机地址
port: 6868, // 定义服务器主机端口号
path: '/', // 定义服务器路径
method: 'POST' // 定义服务器访问方式
};
/**
* 通过http.request()方法
* 由客户端向HTTP服务器发起请求
*/
var req = http.request(options, function(res) {
console.log('STATUS: ' + res.statusCode);
console.log('HEADERS: ' + JSON.stringify(res.headers));
res.setEncoding('utf8');
res.on('data', function(chunk) {
console.log('BODY:' + chunk);
});
});
/**
* 监听request对象的'error'事件
*/
req.on('error', function(e) {
console.log('problme with request: ' + e.message);
});
/**
* write data to request body
*/
req.write('data/n');
/**
* write end to request body
*/
req.end();
console.info('------ http - create basic server ------');
console.info();
var http = require('http'); // 引入http模块
// 调用http.createServer()方法创建服务器
http.createServer(function(req, res) {
// 通过res.writeHeader()方法写HTTP文件头
res.writedHeader(200, {'Content-Type' : 'text/html'}),
// 通过res.write()方法写页面内容
res.write('<h3>Node.js -- HTTP</h3>');
// 通过res.end()方法响应状态吗,并通知服务器消息完成
res.end('<p>Create Basic HTTP Server Response to clients request</p>');
}).listen(6868); // 监听6868端口号
---------------------------------------
####HTTP响应状态码
```javascript
console.info("------ http - create basic client ------");
console.info();
var http = require('http'); // 引入http模块
var querystring = require('querystring'); // 引入Query String模块
/**
* 定义响应状态码数据
*/
var status_codes = new Array();
status_codes[0] = "201";
status_codes[1] = "202";
status_codes[2] = "203";
status_codes[3] = "401";
status_codes[4] = "402";
/**
* 定义查询字段
*/
var postData = new Array();
for(var n = 0; n < 5; n++) {
postData[n] = querystring.stringify({
statuscodes: status_code[n]
});
}
/**
* 模拟HTTP客户端向HTTP服务端连续发送request请求
*/
for(var i = 0; i < 5; i++) {
/**
* 定义服务器参数字段
* @type {{hostname: string, port: number, path: string, method: string, headers: {Content-Type: string, Content-Length: *}}}
*/
var options = {
hostname: 'localhost',
port: 6868,
path: '/' + postData[i],
method: 'POST',
header: {
'Content-Type': 'application/x-www-form-urlencode',
'Content-Length': postData.length
}
};
/**
* 通过http.request()方法
* 由客户端向HTTP服务器发起请求
*/
var req = http.requets(options, function(res) {
console.log('STATUS_CODES:' + res.statusCode);
console.log('HEADERS: ' + JSON.stringify(res.headers));
console.info();
res.setEncoding('utf8');
res.on('data', function(chunk) {
console.log('BODY: ' + chunk);
console.info();
});
});
/**
* 监听request对象的'error'事件
*/
req.on(''error', function(e) {
console.log('problem with request: ' + e.message);
console.info();
})
/**
* write data to request body
*/
req.write("/n");
/**
* write end to request body
*/
req.end();
};
console.info("------ http STATUS_CODES");
console.info();
var http = require('http); // 引入http模块
console.log("Now start HTTP server...");
console.info();
/**
* 调用http.createServer()方法创建服务器
*/
http.createServer(function(req, res) {
var status = req.url,substr(1); // 获取url查询字段
var status_codes = status.substring(12); // 获取HTTP.STATUS_CODES
// 判断http.STATUS_CODES响应状态码集合是否有效
if(!http.STATUS_CODES[status_codes]) {
status_codes = '404';
}
// 通过res.writeHeader()方法写HTTP文件头
res.writeHeader(status_codes, {'Content-Type':'text/plain'});
// 通过res.end()方法发送响应状码,并通知服务器消息完成
res.end(http.STATUS_CODES[status_codes]);
}).listen(6868); // 监听6858端口号
设定和获取HTTP头文件
console.log("------ http - server write header ------");
console.info();
/**
* 调用http.createServer()方法创建服务器
*/
http.createServer(function(req, res) {
/**
* 通过res.writeHead()方法写HTTP文件头
*/
res.writeHead(200, {
'Content-Length' : body.length,
'Content-Type' : ‘text/plain’
});
/**
* 通过res.write()方法写页面内容
*/
res.write("Node.js");
res.write("HTTP");
/**
* 通过res.end()方法发送响应状态码, 并通知服务器消息完成
*/
res.end();
}).listen(6868); // 监听6868端口号
console.info("------ http - client write header ------");
console.info();
var http = require('http'); // 引入http模块
/**
* 定义服务器参数字段
* @type {{hostname : string, port : number, path : string, method : string}}
*/
var options = {
hostname: 'localhost', // 定义服务器主机地址
port: 6868, // 定义服务器主机端口号
path: '/', // 定义服务器路径
method: 'POST' // 定义服务器访问方式
};
/**
* 通过http.request()方法
* 由客户端向HTTP服务器发起请求
*/
var req = http.request(options, function(res) {
console.log('STATUS: ' + res.statusCode);
console.log('HEADERS: ' + JSON.stringify(res.headers));
res.setEncoding('utf8');
res.on('data', funcition(chunk) {
console.log('BODY: ' + chunk);
});
});
// 监听request对象的'error'事件
req.on('error', function(e) {
console.log('problem with request: ' + e.message);
});
req.write('data/n');
re.end();
发送与处理GET请求
console.info("------ http - client get ------');
console.info();
var http = require('http'); // 引入http模块
/**
* 发送HTTP GET请求
*/
http.get("http://localhost:6868/signature=12345678&echostr=78787878×tamp=168",
/**
* GET回调函数
* @param res
*/
function(res) {
console.log('STATUS: ' + res.statusCode); // 打印输出Status_Codes响应状态码
console.info();
/**
* 监听"data"事件处理函数
*/
res.on('data', function(chunk) {
console.log('BODY:' + chunk);
console.info();
});
console.info();
}).on('error',
/**
* "error"事件回调函数
* @param e
*/
function(e) {
console.log("Got error: " + e.message); // 打印出error信息
console.info();
}
);
console.info("------- http - server get ------");
console.info();
var http = require('http'); // 引入http模块
var url = require('url'); // 引入url模块
var qs = require('querystring'); // 引入querystring模块
/**
* 调用http.createServer()方法创建服务器
*/
http.createServer(function(req, res) {
/**
* 通过res.writeHeader()方法写HTTP文件头
*/
res.writeHeader(200, {'Content-Type' : 'text/plain'});
/**
* 通过url.parese()方法获取查询字段
*/
var query = url.$.parseXML(req.url).query;
console.info(query);
console.info();
/**
* 通过res.end()方法发送响应状态码,并通知服务器消息完成
*/
var qs_parse = qs.$.parseXML(query);
console.info(qs_parse);
console.info();
res.end(JSON.stringify(qs_parse));
}).listen(6868); // 监听6868端口号
进行重定向操作
console.info("------ http - create redirect server A ------");
console.info();
var http = require('http'); // 引入http模块
console.log('Now start HTTP server on port 6868...');
console.info();
/**
* 调用http.createServer()方法创建服务器
*/
http.createServer(function(req, res) {
/**
* 通过res.writeHeader()方法写HTTP文件头
*/
res.writeHeader(301, {
'Loaction': 'http://localhost:8686'
});
/**
* 通过res.write()方法写页面内容
*/
res.write('<h3>Node.js --- HTTP</h3>');
/**
* 通过res.end()方法发送响应状态吗,并通知服务器消息完成
*/
res.end('<p>Create Redirect HTTP Server on Port 6868!</p>');
}).listen(6868); // 监听6868端口号
console.info("------ http - create redirect server ------");
console.info();
var http = require('http'); // 引入http模块
console.log('Now start HTTP server on 8686...');
console.info();
/**
* 调用http.createServer()方法创建服务器
*/
http.createServer(function(req, res) {
// 通过res.writeHeader()方法写HTTP文件头
res.writeHeader(200, {'Content-type': 'text/html'});
// 通过res.write()方法写页面内容
res.write('<h3>Node.js - HTTP</h3>');
// 通过res.end()方法发送响应状态吗,并通知服务器消息完成
res.end('<p>Create Redirect HTTP Server on Port 8686!</p>');
}).listen(8686); // 监听8686端口
服务器多路径处理方式
console.info("------ http - server pathname ------");
console.info();
var http = require('http'); // 引入http模块
var url = require('url'); // 引入url模块
console.log('Now start HTTP server on port 6868...');
console.info();
/**
* 调用http.createServer()方法创建服务器
*/
http.createServer(function(req, res) {
/**
* 获取url.pathname路径
* @type{path|*|req.pathname|parseTests.pathname|parseTestWithQueryString}
*/
var pathname = url.parse(req.url).pathname;
/**
* Responding to multi type of request
*/
if(pathname === '/') {
/**
* 通过res.writeHeader()方法写HTTP文件头
*/
res.writeHeader(200, {
'Content-Type': 'text/plain'
});
/**
* 通过res.end()方法响应状态码,并通知服务器消息完成
*/
res.end('Home Page/n');
} else if(pathname === '/about') {
/**
* 通过res.writeHeader()方法写HTTP文件头
*/
res.writeHeader(200, {
'Content-Type': 'text/plain'
});
/**
* 通过res.write()方法写页面内容
*/
res.write('Node.js - HTTP/n');
/**
* 通过res.end()方法发送响应状态码。并通知服务器消息完成
*/
res.end('About Us/n');
} else if(pathname === '/redirect') {
/**
* 通过res.writeHeader()方法写HTTP文件头
*/
res.writeHeader(301, {
'Location': '/'
});
/**
* 通过res.end()方法发送响应状态码,并通知服务器消息完成
*/
res.end();
} else {
/**
* 通过res.writeHeader()方法写HTTP文件头
*/
res.writeHeader(404, {
'Content-Type': 'text/plain'
});
/**
* 通过res.write()方法写页面内容
*/
res.write('Node.js - HTTP/n');
/**
* 通过res.end()方法发送响应状态码,并通知服务器消息完成
*/
res.end('Page not found/n');
}
}).listen(6868); // 监听6868端口号
模拟ping命令连接服务器
console.info("------ http -client ping ------");
console.info();
var http = require('http'); // 引入http模块
console.log("Now start ping HTTP server...");
console.info();
var http = require('http'); // 引入http模块
console.log("Now start ping HTTP server...");
console.info();
/**
* 定义查询字段
*/
var options = {
host: 'localhost',
port: 6868,
path: '/'
};
/**
* 自定义函数 ping_server()
*/
function ping_server() {
/**
* 发送HTTP GET请求
*/
http.get(options. function(res) {
if(res.statusCode == 200) {
console.log("The site is up!");
}
else {
console.log('The site is down!');
}
}).on('error', function(e) {
console.log("There was an error: " + e.message);
});
}
/**进行重定向操作的方法
* 通过setInterval()方法设定时间间隔
*/
setInterval(ping_server, 1000);
console.info("------ http - server ping ---");
console.info();
var http = require('http'); // 引入http模块
console.log("Now start HTTP server...");
console.info();
/**
* 调用http.createServer()方法创建服务器
*/
http.createServer(function(req, res) {
// 通过res.writeHeader()方法写HTTP文件头
if(Math.round(Math.random())) {
res.writeHeader(200, {'Content-Type': 'text/html'});
} else {
res.writeHeader(404, {'Content-Type': 'text/html'});
}
// 通过res.end()方法发送响应状态码,并通知服务器消息完成
res.end();
}).listen(6868); // 监听6868端口号