NodeJS提交表单存数据库(转)

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link rel="stylesheet" href="css/reset.css" />
<link rel="stylesheet" href="css/index.css" />
<title></title>
</head>
<body>
<form>
	<ul>
		<li>
			<label>姓名:</label>
			<input type="text" name="name" id="name" />
		</li>
		<li>
			<label>性别:</label>
			<input type="text" name="sex" id="sex" />
		</li>
		<li>
			<label>年龄:</label>
			<input type="text" name="age" id="age" />
		</li>
		<li>
			<label>手机:</label>
			<input type="text" name="tel" id="tel" />
		</li>
		<li>
			<input type="button" value="提交" id="ok_btn" />
		</li>
	</ul>
</form>
<script src="js/jquery-1.8.3.min.js"></script>
<script>
$('#ok_btn').on('click',function(){
	var name = $.trim($('#name').val()),
		sex = $.trim($('#sex').val()),
		age = $.trim($('#age').val()),
		tel = $.trim($('#tel').val()),
		data = {name : name,sex : sex,age : age,tel : tel};
	$.ajax({
		type : 'POST',
		url : 'http://localhost:1337/',
		data : data,
		success : function(data){
			console.log(data);
		}
	})
})
</script>
</body>
</html>

  server.js

 

测试数据库为test库下的user表,字段为id、name、sex、age、tel

var http = require('http');
var querystring = require('querystring');
var mysql = require('mysql');

//服务器端接收数据
var server = http.createServer(function(req,res){
	if(req.url !== 'favicon.ico'){
		var params;
		req.on('data',function(data){
			//使用querystring模块中的parse方法将字符串转化为对象
			params = querystring.parse(decodeURIComponent(data));
		})
		req.on('end',function(){
			console.log('客户端请求数据已全部接收完毕');
			connect(params);
		})
		//使用Access-Control-Allow-Origin解决跨域问题
		res.setHeader('Access-Control-Allow-Origin','*');
		//返回JSON数据
		res.writeHead(200,{'Content-Type' : 'application/json'});
		res.end(JSON.stringify({status : 1}));
	}
}).listen(1337,'127.0.0.1');

server.on('error',function(e){
	if(e.code == 'EADDRINUSE'){
		console.log('服务器地址及端口已被占用');
	}
})
//设置服务器超时时间为1分钟
server.setTimeout(60*1000,function(socket){
	console.log('服务器超时');
	console.log(socket);
})
server.on('close',function(){
	console.log('服务器已关闭');
})

//连接数据库
function connect(params){
	var connection = mysql.createConnection({
		host : 'localhost',
		port : 3306,
		database : 'test',
		user : 'root',
		password : ''
	});	
	connection.connect(function(err){
		if(err){
			console.log('与mysql数据库建立连接失败');
		}else{
			console.log('与mysql数据库建立连接成功');
			connection.query('insert into user set ?',{
				name : params.name,
				sex : params.sex,
				age : params.age,
				tel : params.tel
			},function(err,result){
				if(err){
					console.log('插入数据失败');
				}else{
					console.log('插入数据成功');
					connection.end();
				}
			})
		}
	})
}

  使用连接池连接数据库

//使用连接池连接数据库
var pool = mysql.createPool({
	host : 'localhost',
	port : 3306,
	database : 'test',
	user : 'root',
	password : ''
});
function connect(params){
	pool.getConnection(function(err,connection){
		if(err){
			console.log('与mysql数据库建立连接失败');
		}else{
			console.log('与mysql数据库建立连接成功');
			connection.query('insert into user set ?',{
				name : params.name,
				sex : params.sex,
				age : params.age,
				tel : params.tel
			},function(err,result){
				if(err){
					console.log('插入数据失败');
				}else{
					console.log('插入数据成功');
					//当一个连接不需要使用时,将其归还到连接池中
					connection.release();
					//关闭连接池
					//pool.end();
				}
			})
		}
	})
	//处理数据库服务器连接中断时的操作
	pool.on('error',function(err){
		if(err.code === 'PROTOCOL_CONNECTION_LOST'){
			console.log('与mysql数据库之间的连接丢失');
			//3秒后重新尝试连接数据库
			setTimeout(function(){
				connect();
			},3000);
		}else{
			throw err;
		}
	})
}

  

测试:

把项目放在服务器环境下,node执行server.js,然后提交表单即可

 

注意:由于跨域问题,使用CORS解决方案

JSONP由于传输数据量较大,需要使用POST方式提交,所以使用CORS技术(跨域资源共享)

CORS定义一种跨域访问的机制,允许一个域上的网络应用向另一个域提交跨域AJAX请求,只需由服务器发送一个响应标头即可

例子:(PHP环境)

header("Access-Control-Allow-Origin:*");  //*表示允许任何域向我们的服务端提交请求

header("Access-Control-Allow-Origin:http://www.test.com"); //只允许指定的域

(NodeJS环境)

res.setHeader("Access-Control-Allow-Origin","*");

 

执行时,可能提示cannot find moudle 'MySQL',请在项目目录下安装mysql模块即可:npm install mysql

 
0
posted @ 2016-12-19 13:47  Garven  阅读(393)  评论(0)    收藏  举报