淘先锋技术网

首页 1 2 3 4 5 6 7

目录

1、NodeJS 简介

2、NodeJS 模块机制

3、Node-HTTP 模块

4、文件管理功能

1)、文件上传

2)、文件读取

5、NodeJS 操作数据库

6、Sql 防注入问题

7、Mysql 连接池


 

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();  //释放连接的使用权
        });  
    }
});