基於express框架下Node.js+MySQL連線池的資料庫增添操作
阿新 • • 發佈:2019-02-09
題記:
這幾天一直在學習Node以及關係型資料庫的知識,剛剛接觸到了express框架,就想利用express框架,實現一個通過ajax操作來向資料庫內增添資料的功能。
正文:
話不多說,現在我們就來一起看看吧!我們需要了解哪些知識,做哪些基本工作!
那麼,我們先從第一步做起,那就是寫前端的程式碼:
註釋如下:
- 首先,我們要了解我們的基本技術點。前端:html+jquery下的AJAX方法
- 其次,我們要了解後端的知識,我是用的基於express框架下的node
- 然後,對於靜態的html,是無法傳送請求的,我使用的是nginx,非常輕量級的伺服器
最後,我們使用MySQL這個典型的關係型資料庫+視覺化工具navicat
那麼,我們先從第一步做起,那就是寫前端的程式碼:註釋如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>接收引數</title>
</head>
<body>
<!-- 需要輸入的text -->
username:<input type="input" id="username"> <br>
firstname:<input type="input" id="firstname">
<button type="button" id="btn">點選提交</button>
<script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/1.6.4/jquery.min.js"></script>
<script type="text/javascript">
$(function() {
$('#btn').click(function () {
var username = $('#username').val(); // 獲取username的值
var firstname = $('#firstname').val(); // 獲取firstname的值
$.ajax({
url: 'http://localhost:1337/login', // url地址要跟node中的地址對應
type: 'POST', // GET或者POST ,這裡選用POST
dataType: 'json',
data: {
username: username,
firstname: firstname
},
success:function(data) {
console.log(data);
switch (data.code){
case 1:
alert('插入資料成功');
break;
case 2:
alert('插入資料失敗');
break;
case 0:
alert('請求失敗,請檢查資料格式!');
}
}
})
});
});
</script>
</body>
</html>
上面的程式碼中,包含了html已經如何獲取輸入框內的值傳向後端
接下來,在開始展示node程式碼之前,我想先向大家展示一下資料庫的設計
因為關係型資料庫與NOSQL不太一樣,NOSQL是由文件(關係型中的row)組成,再有多個文件組合成集合(關係型中的table,具有很高的靈活性,每個文件中的key是可以不一樣的。而關係型則必須提前設計好欄位,我們才可以向表中插入一行資料下面簡單展示一下資料庫。(本人是學前端的,所以可能看起來很不成熟,希望大家諒解)
* 下面,我們來看看基於express的node是如何寫的(server端的JavaScript):*
/**
*@fileName: 114.1.2.js
*@author: 吳曉陽
*@time: 2017/12/15
*@description: 利用連線池進行多次提交
*/
var express = require('express'); // express模組 可以使用 npm install -g express
var qs = require("querystring"); // querystring模組 可以使用 npm install -g express 用於處理傳來的引數串
var mysql = require('mysql'); // mysql模組 同樣可以使用 npm install -g mysql 來全域性下載
var app = express();
var pool = mysql.createPool({
host : 'localhost', // 主機名
port : 3306, // 資料庫連線的埠號 預設是3306
database : 'test', // 需要查詢的資料庫
user : 'root', // 使用者名稱
password : '' // 密碼,我的密碼是空。所以是空字串
});
app.post('/login',function (req,res) { // 注意 這裡的login與最後的app.listen(1337,'localhost') 組成 localhost:1337/login 與 前端的ajax的url相對應,這裡我也是自己搞了好久,才對應上,否則會報404
var body = "",data;
req.on('data', function(chunk) {
body += chunk;
console.log(body);
});
req.on('end', function() {
// 解析引數
data=qs.parse(body); // 這裡值得注意!querystring中的pares方法可以吧data解析成物件,供下文使用
// 設定響應頭部資訊及編碼
res.writeHead(200, {
'Content-Type': 'text/html;charset=utf8',
"Access-Control-Allow-Origin":"*" //*表示允許的域名地址,本地則為'http://localhost' 不新增此引數 會被認為是跨域
});
if(data.username) { // 輸出提交的資料
// 插入資料
pool.getConnection(function (err,connection) { // 使用連線池
if(err){
console.log('與MySQL資料庫建立連線失敗!');
console.log('錯誤資訊為:' + err);
}
else{
console.log('與MsSQL資料庫建立連線成功!');
connection.query('INSERT INTO users SET ?',{
username: data.username, // data.username 則是 由qs解析過的
firstname: data.firstname // data.firstname 則是 由qs解析過的
},function (err,result) {
if(err){
console.log('插入資料失敗');
res.end('{code:2}'); // 同時要注意返回的資料要是json物件,以下同
connection.release(); // 釋放連線池的連線,因為連線池預設最大連線數是10,如果點選數超過10 則不會與客戶端連線,客戶端的請求也會因為長時間無反應報錯,下面會粘出報錯的圖
}
else{
console.log('插入資料成功');
res.end('{code:1}');
connection.release(); // 釋放連線池的連線
}
})
}
});
} else {
res.end('{code:0}'); // 傳入的值為空時,不執行插入操作
}
})
});
app.listen(1337,'localhost');
如果不釋放連線池的連線,我們點選15次會發現:
第十一個請求,會無反應。
釋放連線池的連線後,示例如下:
我們會發現,十多次點選都是有反應的,這就代表,我們每次完成一次插入操作後,連線又重新回到了連線池中,供下一次請求使用!最後,資料庫中添入資料如下:
結尾:
最後呢,希望大家可以自己嘗試一下,有什麼寫的不對的地方也請不吝指教!