nodejs實現前后端交互


本人nodejs入門級選手,站在巨人(文殊)的肩膀上學習了一些相關知識,有幸在項目中使用nodejs實現了前后端交互,因此,將整個交互過程記錄下來,方便以后學習。

本文從宏觀講述nodejs實現前后端交互過程,以及該過程中每一個部分如何起到其相應的作用,並沒有對每一個部分詳細闡述,因為每一個部分都可以作為一個獨立的知識點,本文只將項目中用到的知識點進行總結。

前后端交互主要包括3個部分,前端頁面、后端服務器、以及數據庫,它們之間的關系及整個請求過程如下圖所示:

 

其中重點在於服務器部分,它需要實現以下功能:解決跨域,解析post及get參數,與數據庫建立連接,執行sql,獲取數據 or 更新操作,斷開連接,處理異常,將結果返回。以下將對該部分進行詳細說明。

簡單說明nodejs server需要依賴的幾個重要模塊:

1. express:

nodejs的Web應用框架,如下創建一個基本的express程序

var express = require('express'); var app = express(); app.get('/', function(req, res){ res.send('hello world'); }); app.listen(8181); 

2. bodyParser:

express默認使用的模塊,用於解析http請求,

app.use(bodyParser.urlencoded({ extended: false }));//用於解析req.body數據 

3. mysql:

nodejs需要依賴的數據庫模塊。

解決跨域請求

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如何進行前后端交互,以及與數據庫交互;在以后的項目開發中,需要首先明確需求,通過流程圖細化整個過程,開發過程才會更清晰明確,否則容易忽視一些細節。

參考鏈接:

Express - api參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM