node.js學(xué)習(xí)筆記之MySQL-EJS

node.js調(diào)用數(shù)據(jù)庫(kù)MySQL,然后渲染到前端頁(yè)面上

開(kāi)始

調(diào)用及初始化

//express框架
var express=require('express');
var app=express();

//mysql框架
var mysql=require('mysql');
var connection=mysql.createConnection({
    host:'localhost',
    user:'root',
    password:'root',
    port:'3306',
    database:'school'
})
connection.connect();

//ejs框架
var ejs=require('ejs');

//配置ejs
app.set('view engine','ejs');
app.use(express.static('public'));

由前文可知兔仰,node.js 連接MySQL用到了 connection.query()獲取到result,調(diào)用ejs框架用到了res.render('/',result) 渲染到前端頁(yè)面庄呈。

由此可以推出只要讓ejs的render的參數(shù)result作為query()獲得的result就可以實(shí)現(xiàn)將數(shù)據(jù)庫(kù)的數(shù)據(jù)渲染到前端頁(yè)面鸯乃。

那我們把它們集合到express框架的app.get()里面。

app.js

var express=require('express');
var app=express();

var mysql=require('mysql');
var connection=mysql.createConnection({
    host:'localhost',
    user:'root',
    password:'root',
    port:'3306',
    database:'school'
})
connection.connect();

var ejs=require('ejs');

app.set('view engine','ejs');
app.use(express.static('public'));

app.get('/',function (req,res) {
    var mySql='select * from student';
    connection.query(mySql,function (err,result) {
        //result為查詢到的結(jié)果
        res.render('index',{
            students:result
        });
    });
})

connection.end();

app.listen(8001);

index.ejs

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <link rel="stylesheet" href="global.css">
</head>
<body>
    <p>接下來(lái)我要用ejs渲染數(shù)據(jù)庫(kù)數(shù)據(jù)到前端</p>
    <table border="1" cellpadding="15">
        <tr>
            <th>學(xué)號(hào)</th>
            <th>姓名</th>
            <th>分?jǐn)?shù)</th>
        </tr>
        <% for(var i=0;i<students.length;i++) { %>
        <tr>
            <td><%= students[i].id %></td>
            <td><%= students[i].name %></td>
            <td><%= students[i].score %></td>
        </tr>
        <% } %>
    </table>
    <h4>總共有 <%= students.length %> 個(gè)學(xué)生</h4>
</body>
</html>

查看運(yùn)行結(jié)果

image

完成任務(wù)玄呛,把數(shù)據(jù)庫(kù)的數(shù)據(jù)渲染到了前端的頁(yè)面上阅懦,可以實(shí)現(xiàn)前后端數(shù)據(jù)同步,但是這還缺一定的交互性徘铝,比如實(shí)現(xiàn)前端可以直接操作數(shù)據(jù)庫(kù)數(shù)據(jù)耳胎,這個(gè)可能就需要get/post表單了

這里得分清一下表單的get/post方法區(qū)別
  • GET - 從指定的資源請(qǐng)求數(shù)據(jù)。
  • POST - 向指定的資源提交要被處理的數(shù)據(jù)
image

所以還是用GET比較簡(jiǎn)單吧惕它!

首先我們得在前端界面創(chuàng)建一個(gè)form標(biāo)簽怕午。

//省略了頭文件

<body>
    <p>建立一個(gè)form表單,與數(shù)據(jù)庫(kù)數(shù)據(jù)交互</p>
    <form action="/search" method="get">
        <input type="text" name="data_name">
        <input type="submit" value="搜索">
        <br>
    </form>
    <br>
    <table border="1" cellpadding="15">
        <tr>
            <th>學(xué)號(hào)</th>
            <th>姓名</th>
            <th>分?jǐn)?shù)</th>
        </tr>
        <% for(var i=0;i<student.length;i++) { %>
        <tr>
            <td><%= student[i].id %></td>
            <td><%= student[i].name %></td>
            <td><%= student[i].score %></td>
        </tr>
        <% } %>
    </table>
</body>

我僅僅只在表格前面加一個(gè)輸入框,和一個(gè)按鈕淹魄。

image

我的目的就是可以在輸入框輸入郁惜,然后點(diǎn)擊搜索后,表格數(shù)據(jù)會(huì)變更甲锡。

我的表單是get請(qǐng)求兆蕉。

那我就需要在app.js加多一個(gè)get請(qǐng)求羽戒。

首先可以通過(guò)

//獲取輸入框的值
app.get('/search',function(req,res){
    console.log(req.query);
    res.send();
}

用到了req,query

image

然后看一下地址

http://localhost:8005/search?data_name=chen

通過(guò)get請(qǐng)求請(qǐng)求到了數(shù)據(jù),看看console出什么

image

也就是說(shuō)可以通過(guò)req,query.data_name獲取chen

獲取到的這個(gè)寫入sql語(yǔ)句不就可以了恨樟。

var searchInfo=req.query.data_name;
var selectSql="select * from student where name='"+searchInfo+"'";

那接下來(lái)加多一個(gè)app.get

var express=require('express');
var app=express();

var mysql=require('mysql');
var connection=mysql.createConnection({
    host:'localhost',
    user:'root',
    password:'root',
    port:'3306',
    database:'school'
})
connection.connect();

var ejs=require('ejs');

app.set('view engine','ejs');
app.use(express.static('public'));

app.get('/',function (req,res) {
    var mySql='select * from student';
    connection.query(mySql,function (err,result) {
        //result為查詢到的結(jié)果
        if(err){
            console.log(err.message);
        }
        res.render('index',{
            student:result
        });
    });
})

app.get('/search',function(req,res){
    console.log(req.query);
    searchInfo=req.query.data_name;
    var selectSql="select * from student where name='"+searchInfo+"'";
    //匹配到輸入框的內(nèi)容就會(huì)顯示
    connection.query(selectSql,function (err,result) {
        //result為查詢到的結(jié)果
        if(err){
            console.log(err.message);
        }
        res.render('index',{
            student:result
        });
    });
})

app.listen(8005);

上面僅僅加多了一個(gè)get請(qǐng)求而已

什么原理半醉?

我的理解是 前端通過(guò)form表單的get請(qǐng)求以及action='/search',會(huì)跳轉(zhuǎn)到地址下的search劝术。在node.js下寫一個(gè)app.get()缩多,會(huì)實(shí)時(shí)檢測(cè)到如果有/search的請(qǐng)求,就會(huì)執(zhí)行养晋。然后通過(guò)用res.render()渲染原來(lái)的網(wǎng)頁(yè)index衬吆。重新刷新網(wǎng)頁(yè)。

image

達(dá)到我們的目的绳泉。

但是逊抡!說(shuō)一個(gè)小細(xì)節(jié):搜索應(yīng)該是匹配,而不是等于零酪。

var selectSql='select * from student where name REGEXP \''+searchInfo+'\'';

修改了下sql語(yǔ)句冒嫡。

image

這樣才符合邏輯!

查詢達(dá)到了目的四苇。

那還有新建孝凌,刪除,修改呢月腋?

em....先加多幾個(gè)標(biāo)簽

image

(雖然很丑蟀架,把基礎(chǔ)弄好先把)

修改

UPDATE 表名稱 SET 列名稱 = 新值 WHERE 列名稱 = 某值
//修改
app.get('/search',function(req,res){
    console.log(req.query.update_info_before);
    searchInfoBefore=req.query.update_info_before;
    searchInfoAfter=req.query.update_info_after;
    
    var updateSql="update student set name = ? where name=?";
    var updateSql_Params = [searchInfoAfter, searchInfoBefore];

    connection.query(updateSql,updateSql_Params,function (err,result) {
        if(err) {
            console.log('更新失敗' + err);
            return;
        }
        console.log('更新成功!');
    })

    var Sql='select * from student';
    //匹配到輸入框的內(nèi)容就會(huì)顯示
    connection.query(Sql,function (err,result) {
        //result為查詢到的結(jié)果
        if(err){
            console.log('[select error]'+err.message);
        }
        res.render('index',{
            student:result
        });
    });
})

看看效果

image

Yeah ~ 修改達(dá)到了目的!

新建

INSERT INTO 表名稱 VALUES (值1, 值2,....)
//插入
app.get('/search',function(req,res){

    var  insertSql = 'insert into student(id,name,score) values(?,?,?)';
    var  insertSql_Params = [req.query.insert_Id,req.query.insert_Name,req.query.insert_Score];

    connection.query(insertSql,insertSql_Params,function (err,result) {
        if(err) {
            console.log('插入失敗' + err);
            return;
        }
        console.log('更新成功!');
    })

    var Sql='select * from student';
    //匹配到輸入框的內(nèi)容就會(huì)顯示
    connection.query(Sql,function (err,result) {
        //result為查詢到的結(jié)果
        if(err){
            console.log('[select error]'+err.message);
        }
        res.render('index',{
            student:result
        });
    });
})
image

插入也完成了榆骚。感覺(jué)一樣的道理片拍。

刪除

//刪除
app.get('/search',function(req,res){

    var  deleteSql = " delete from student where name='"+req.query.delete_info+"'";

    connection.query(deleteSql,function (err,result) {
        if(err) {
            console.log('刪除失敗' + err);
            return;
        }
        console.log('刪除成功!');
    })

    var Sql='select * from student';
    //匹配到輸入框的內(nèi)容就會(huì)顯示
    connection.query(Sql,function (err,result) {
        //result為查詢到的結(jié)果
        if(err){
            console.log('[select error]'+err.message);
        }
        res.render('index',{
            student:result
        });
    });
})
image

刪除也完成!

每個(gè)部分的原理其實(shí)基本都很類似妓肢,通過(guò)get/post方式獲取值捌省,再用sql語(yǔ)句執(zhí)行。

之后還有排序碉钠,創(chuàng)建多個(gè)表等的功能需要實(shí)現(xiàn)纲缓。

而且當(dāng)前這個(gè)界面還不是我想要的,我想要的是實(shí)現(xiàn)一個(gè)真正的后臺(tái)管理平臺(tái)放钦。

實(shí)現(xiàn)前端與數(shù)據(jù)庫(kù)交互色徘。

加油恭金!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末操禀,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子横腿,更是在濱河造成了極大的恐慌颓屑,老刑警劉巖斤寂,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異揪惦,居然都是意外死亡遍搞,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門器腋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)溪猿,“玉大人,你說(shuō)我怎么就攤上這事纫塌≌锵兀” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵措左,是天一觀的道長(zhǎng)依痊。 經(jīng)常有香客問(wèn)我,道長(zhǎng)怎披,這世上最難降的妖魔是什么胸嘁? 我笑而不...
    開(kāi)封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮凉逛,結(jié)果婚禮上性宏,老公的妹妹穿的比我還像新娘。我一直安慰自己鱼炒,他們只是感情好衔沼,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著昔瞧,像睡著了一般指蚁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上自晰,一...
    開(kāi)封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天凝化,我揣著相機(jī)與錄音,去河邊找鬼酬荞。 笑死搓劫,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的混巧。 我是一名探鬼主播枪向,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼咧党!你這毒婦竟也來(lái)了秘蛔?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎深员,沒(méi)想到半個(gè)月后负蠕,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡倦畅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年遮糖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叠赐。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡欲账,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出芭概,到底是詐尸還是另有隱情敬惦,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布谈山,位于F島的核電站俄删,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏奏路。R本人自食惡果不足惜畴椰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鸽粉。 院中可真熱鬧斜脂,春花似錦、人聲如沸触机。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)儡首。三九已至片任,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蔬胯,已是汗流浹背对供。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留氛濒,地道東北人产场。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像舞竿,于是被迫代替她去往敵國(guó)和親京景。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 概要 64學(xué)時(shí) 3.5學(xué)分 章節(jié)安排 電子商務(wù)網(wǎng)站概況 HTML5+CSS3 JavaScript Node 電子...
    阿啊阿吖丁閱讀 9,208評(píng)論 0 3
  • 搭建開(kāi)發(fā)環(huán)境并模擬交互數(shù)據(jù) 一骗奖、實(shí)驗(yàn)說(shuō)明 下述介紹為實(shí)驗(yàn)樓默認(rèn)環(huán)境确徙,如果您使用的是定制環(huán)境靡菇,請(qǐng)修改成您自己的環(huán)境介...
    玄月府的小妖在debug閱讀 2,126評(píng)論 0 15
  • node.js 介紹 node.js是什么 node.js 是一個(gè)開(kāi)發(fā)平臺(tái),就像java開(kāi)發(fā)平臺(tái)...何為開(kāi)發(fā)平臺(tái)...
    小淺_閱讀 1,164評(píng)論 0 6
  • 個(gè)人入門學(xué)習(xí)用筆記、不過(guò)多作為參考依據(jù)米愿。如有錯(cuò)誤歡迎斧正 目錄 簡(jiǎn)書好像不支持錨點(diǎn)、復(fù)制搜索(反正也是寫給我自己看...
    kirito_song閱讀 2,472評(píng)論 1 37
  • ?我覺(jué)知鼻吮、我感恩育苟! ?我是如此被愛(ài)! ?信守承諾椎木,感恩第六天违柏! 1.感恩自己每天早起去上班,沒(méi)有睡懶覺(jué)的習(xí)慣了香椎,以...
    徐海霞4913閱讀 288評(píng)論 0 0