本人nodejs入门级选手,站在巨人(文殊)的肩膀上学习了一些相关知识,有幸在项目中使用nodejs实现了先后端交互,所以,将整个交互过程记录下来,方便之后学习。html
本文从宏观讲述nodejs实现先后端交互过程,以及该过程当中每个部分如何起到其相应的做用,并无对每个部分详细阐述,由于每个部分均可以做为一个独立的知识点,本文只将项目中用到的知识点进行总结。前端
先后端交互主要包括3个部分,前端页面、后端服务器、以及数据库,它们之间的关系及整个请求过程以下图所示:node
其中重点在于服务器部分,它须要实现如下功能:解决跨域,解析post及get参数,与数据库创建链接,执行sql,获取数据 or 更新操做,断开链接,处理异常,将结果返回。如下将对该部分进行详细说明。mysql
1. express:正则表达式
nodejs的Web应用框架,以下建立一个基本的express程序sql
var express = require('express'); var app = express(); app.get('/', function(req, res){ res.send('hello world'); }); app.listen(8181);
2. bodyParser:数据库
express默认使用的模块,用于解析http请求,express
app.use(bodyParser.urlencoded({ extended: false }));//用于解析req.body数据
3. mysql:后端
nodejs须要依赖的数据库模块。api
app.all('*', function(req, res, next) { //容许的来源 res.header("Access-Control-Allow-Origin", "*"); //容许的头部信息,若是自定义请求头,须要添加如下信息,容许列表能够根据需求添加 res.header("Access-Control-Allow-Headers", "Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild"); //容许的请求类型 res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS"); res.header("X-Powered-By",' 3.2.1') next(); });
1. 路由
app.VERB(path, [callback...], callback)
app.VERB() 方法为Express提供路由方法, VERB 是指某一个HTTP 动做, 好比 app.get()。例如
app.get('/', function(req, res, next){ res.send('hello world'); });
路径字符串会被转为正则表达式,当接收到get请求以后,Express会将请求路径与该正则表达式比较,符合条件的会执行回调方法。
2. 解析请求参数
get请求
app.get('/', function(req, res, next) { var querys = req.query || {};//获取get请求的请求参数 var query = req.originalUrl;//获取请求url res.send('hello world'); });
post请求
app.post('/', function(req, res, next) { var body = req.body;//获取post请求的请求参数 var query = req.originalUrl;//获取请求url res.send('hello world'); });
res.send([body|status], [body])方法用于返回信息,status默认为200,例如
res.send({}); res.send([]); res.send(""); res.send(404,'{"errno":"10001", "errmsg":"访问页面或者接口不存在!"}')
1. 与数据库创建链接
connection = mysql.createConnection({ host: '', user: 'root', password: '******', database: 'test' }); connection.connect();
2. 执行sql语句
connection.query("sql",[params], function(err, result, fields){});
例如
var table = "table";//要查询的数据表 var query = "/test"; //path参数 var sql = 'select content from '+table+' where path = ' +'"'+ query +'"'; connection.query(sql,function(err, result, fields){ if(err){ //失败,执行异常处理 }else{ //成功,返回请求信息 var firtRow = result[0] || {};//result为数据库检索结果 } });
再如
var table = "table";//要查询的数据表 var params = ["/test","post","1"]; var sql = 'UPDATE ' + table + ' SET path = ?, sendtype = ?, WHERE id = ?'; connection.query(sql, params, function(err, result){ if(err){ //失败,执行异常处理 }else{ //成功,返回请求信息 } });
注意:数据库检索结果是以键值对的形式返回的,例如
'select content from table where id=1' //返回的结果信息为 "content":"testcontent"
从数据库获取信息以后须要进行处理才能返回到客户端。
3. 断开链接
connection.end();
每次执行sql语句以后,最好断开与数据库的链接,下次再执行的时候再从新创建链接。
补充:node 的mysql模块有问题,当一个链接断开的时候,马上去创建链接,这样循环屡次会形成链接建立失败;解决方法有2个,链接不断开,也不须要每次从新创建链接;或者换一个模块,不用mysql。
总结:经过该项目学习了nodejs如何进行先后端交互,以及与数据库交互;在之后的项目开发中,须要首先明确需求,经过流程图细化整个过程,开发过程才会更清晰明确,不然容易忽视一些细节。
参考连接: