目录
1、NodeJS 简介
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。Node.js 的包管理器 npm,是全球最大的开源库生态系统。
创建一个简单的服务器:
var http=require("http");
var server=http.createServer(function(req,res){
res.end("Hello,你好!");
});
server.listen(3000);
示例:
var http=require("http"); //引用http模块,创建http对象
//创建Web服务器
var x=100;
var server=http.createServer(function(request,response){
// response.setHeader("content-Type","text/html; charset=UTF-8");
// response.write("<head><meta charset='utf-8'></head>");
// // response.end("<h1>Hello world!您好!</h1>");
// x=parseInt(Math.random()*10000);
// if(x==8888){
// throw new Error("8888"+request.connection.remoteAddress);
// }
// else {
response.end("Hello world!");
// }
// x++;
});
server.listen(8800); //启动监听,设置端口号(<=65535)
console.log("starting...");
NodeJS 的特点:1)、单线程:nodejs 在单线程下,1个8G的内存理论上可以同时处理超过4万个用户请求 ;2)、异步I/O ;3)事件驱动:事件驱动是NodeJs的底层机制,保证Nodejs高效准确运行而不会发生紊乱 ;4)、可以跨平台使用 。
2、NodeJS 模块机制
一个模块就是一个文件。模块块定义 :
exports.属性=function(){}
module.exports=function(){}
//直接输出函数,一个JS文件中会有覆盖现象
模块引用 :require() ;模块标识 :require()的参数:相对路径或绝对路径,可不加扩展名(.js),如果不加路径分隔符,则搜索node_modules。node_modules:系统尝试在此文件夹里加载相应模块 。
CommonJS的模块机制很好地避免了变量的污染问题 。
3、Node-HTTP 模块
1)、建立 web 服务器
//引入http模块
require(‘http’)
//创建httpServer :
createServer(function(request,response){})
//监听客户端连接
listen(端口号,主机地址)
2)、解析请求
request
//Get请求:
url模块
querystring模块
//Post请求
request.on(‘data’, function (chunk) {}
//记录数据
request.on(‘end’,function(){});
//End事件中反序列化为对象
3)、回复浏览器请求
response
setHeader
write()
end()
//解析文件浏览请求
__dirname:当前路径
示例:请求request
var http=require("http"); //引用http模块,创建http对象
//创建Web服务器
var url=require("url"); //引入URL模块
var querystring=require("querystring");
var server=http.createServer(function(request,response){
var params=url.parse(request.url,true);
var pathname=params.pathname; //获取请求的路径
if(pathname=="/add"){
var dt="";
request.on("data", function (chunk) {
dt+=chunk
});
request.on("end", function () {
var pData=querystring.parse(dt);
console.log(pData);
});
}
});
server.listen(8000); //启动监听,设置端口号(<=65535)
console.log("starting...");
回复:response
var http=require("http"); //引用http模块,创建http对象
//创建Web服务器
var url=require("url"); //引入URL模块
var server=http.createServer(function(request,response){
var params=url.parse(request.url,true);
var pathname=params.pathname; //获取请求的路径
if(pathname=="/add"){
var query=params.query;
response.end("Add Data!"+query.id+"|"+query.name);
}
else if(pathname=="/mod"){
response.end("Mod Data!");
}
else if (pathname=="/del"){
// JSON.stringify({name:"syl"});
response.end("Del data!");
}
});
server.listen(8800); //启动监听,设置端口号(<=65535)
console.log("starting...");
4、文件管理功能
1)、文件上传
浏览器发送POST请求:提交form method=‘POST’ ;数据请求符合 Multipart/form-data 规范: enctype = "multipart/form-data" 。
formidable: 处理文件上传数据的模块 (非核心模块),安装方法: npm install formidable 。使用方法:
//实例化对象:
var form=new formidable.IncomingForm()
//设置form参数:
上传路径:uploadDir
文件扩展名:keepExtensions (true|false)
多文件处理:multiples ( true|false )
//解析POST数据:
parse(request, function(err,fields,files){})
fields:POST请求中的其他参数
files:POST请求中的文件信息
示例:
// 文件处理
// 首先安装formidable
var http=require("http"); //引用http模块,创建http对象
var url=require("url"); //引入URL模块
var querystring=require("querystring");
var formidable=require("formidable");
//创建Web服务器
// var ParamOp=require("./m/paramOption");
var server=http.createServer(function(request,response){
var params=url.parse(request.url,true);
var pathname=params.pathname; //获取请求的路径
if(pathname=="/upfile"){
var form=new formidable.IncomingForm(); //初始化对象
form.uploadDir="./files"; //设置文件接收的文件夹
form.keepExtensions=true; //保留接收文件的扩展名
form.parse(request,function(err,fileds,files){
console.log(files);
response.end("success!");
});
}
});
server.listen(8800); //启动监听,设置端口号(<=65535)
console.log("starting...");
2)、文件读取
var http=require("http"); //引用http模块,创建http对象
//创建Web服务器
var fs=require("fs");
var server=http.createServer(function(request,response){
response.setHeader("content-Type","text/html; charset=UTF-8");
fs.readFile("./posttemp.html",function(err,data){ //文件路径
if(!err){
response.end(data);
}
});
});
server.listen(8800); //启动监听,设置端口号(<=65535)
console.log("starting...");
5、NodeJS 操作数据库
安装: npm install mysql 。核心模块:
//引用mysql模块
require(‘mysql’)
//设置连接配置参数
{
user:'root',
password:'123',
host: “localhost",
port: 3306,
database: "test"
};
//创建mysql的连接对象Connection
createConnection(config)
Connection.connect() :打开连接
//执行查询:
connection.query(sql,[values],function(err,results,field){})
//关闭连接
end()
示例:
// 数据库操作1
var mysql=require("mysql");
var config={
user:"root",
password:"123",
host:"localhost",
port:3306,
database:"test"
};
var connection=mysql.createConnection(config); //创建MYsql连接,返回连接对象
// var user="xxxx' or 1=1 #";
// var pwd="8767889";
// var sql="select * from tb_login where name='"+user+"' and pwd='"+pwd+"'";
var user="syl";
var pwd="123456";
var sql="select * from tb_login where name=? and pwd=?";
// 执行Sql语句
connection.query(sql,[user,pwd],function(err,results,filed){
if(!err){
console.log(results.length);
}
});
connection.end(); //关闭连接
视图:
Mysql 语法:create view 视图名 as sql 语句...
NodeJS 操作视图方法与一般表相同。
6、Sql 防注入问题
所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
Nodejs防Sql注入的方法:1)、使用conection. escape() ;2)、带参数的Sql语句 ;3)、使用存储过程 。
事务调用
保持数据一致性。用法:beginTransaction 、rollback 、commit 。
存储过程 :
var sql = "call p_test(?,@a);select @a;"
//输入参数用?标识
//输出参数用@标识
7、Mysql 连接池
//创建连接池
createPool(poolOption)
poolOption: {
connectionLimit : 10,
host : '127.0.0.1',
port: 3306,
user : 'root',
password : '123456',
database : 'test' ,
multipleStatements: true
}
//取出连接池中的连接:
getConnection(function(err, connection){})
//释放连接:
release()
示例:
// 数据库连接池操作
var mysql=require("mysql");
var config={
connectionLimit:10,
user:"root",
password:"123",
host:"localhost",
port:3306,
database:"test"
};
// 创建连接池
var pool=mysql.createPool(config);
pool.getConnection(function(err,connection){
if(!err){
var user="syl";
var pwd="123456";
var sql="select * from tb_login where name=? and pwd=?";
// 执行Sql语句
connection.query(sql,[user,pwd],function(err,results,filed){
if(!err){
console.log(results.length);
}
connection.release(); //释放连接的使用权
});
}
});