也許是最簡單的node egg入門demo

前言:

對于node能實(shí)現(xiàn)的后臺比較感興趣伦乔,大致看了下node和egg文檔厉亏,了解了下基本的sql語句開始學(xué)習(xí)node了,發(fā)現(xiàn)教程的確比較少烈和,記錄分享一個egg的入門demo爱只。

準(zhǔn)備工作

egg-init

安裝完node,npm斥杜,egg-init虱颗,egg-bin后使用egg-init egg-example --type=simple快速搭建項(xiàng)目,然后配置所需要的package.json的文件蔗喂。頁面渲染使用文檔中的 Nunjucks ,訪問數(shù)據(jù)庫采用 egg-mysql 高帖。

package.json:

在config/config/plugin.js下開啟插件缰儿,config/config.default.js下配置關(guān)聯(lián)和數(shù)據(jù)庫信息。

// config/config/plugin.js
'use strict';

exports.nunjucks = {

    enable: true,

    package: 'egg-view-nunjucks'

};

exports.mysql = {

    enable: true,

    package: 'egg-mysql',

};
config/config.default.js
'use strict';

module.exports = appInfo => {
  const config = {
    // 渲染模板
    view:{
      defaultViewEngine:'nunjucks',
      mapping:{
        '.tpl':'nunjucks',
      }
    },
    mysql: {
      client: {
          // ip地址
          host: 'localhost',
          // 端口
          port: '3306',
          // 用戶名
          user: 'root',
          // 密碼
          password: '123456',
          // 數(shù)據(jù)庫名
          database: 'test',   
      },
      app: true,
      agent: false,
  }
};
// use for cookie sign key, should change to your own and keep security
config.keys = appInfo.name + '_1521956862800_7591';
// add your config here
config.middleware = [];
  return config;
};

創(chuàng)建mysql模擬數(shù)據(jù)表

安裝下載mysql散址,打開mysqlworkbench乖阵,初次打開設(shè)置密碼123456宣赔。


新建數(shù)據(jù)庫
新建表注意id自增長,int類型
上傳成功

測試預(yù)覽

npm run dev測試查看瞪浸,默認(rèn)127.0.0.1:7001端口儒将。

app下新建view文件夾,新建.tpl文件模擬頁面綁定ajax事件

app/view/index.tpl
<html>
  <head>
    <title>Egg Demo</title>
    <link  rel="stylesheet">
  </head>
  <body class="container">
    <input class="form-control" type="text"><br />
    <button class="btn btn-success">上傳到數(shù)據(jù)庫</button>
    <button class="btn btn-success">刪除</button>
    <button class="btn btn-success">查詢對應(yīng)</button>
    <button class="btn btn-success">更新對應(yīng)</button>
    <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
    <script>
      $("button:eq(0)").click(function(){
        var data= $("input").val();
        if(data){
          $.ajax({
          type:'get',
          url:'/add/'+data,
          success:function(data){
              if(data == 'success'){
                  alert('上傳成功对蒲!');
              }
            }
          });
        }
      });

      $('button:eq(1)').on('click',function(){
        var data= $("input").val();
         if(data){
          $.ajax({
          type:'get',
          url:'/del/'+data,
          success:function(data){
              if(data == 'success'){
                  alert('刪除成功钩蚊!');
              }
            }
          });
        }
      })

      //reach
      $('button:eq(2)').on('click',function(){
        var data= $("input").val();
         if(data){
          $.ajax({
          type:'get',
          url:'/get/'+data,
          success:function(data){
              if(data == 'success'){
                  alert('查詢成功!');
              }
            }
          });
        }
      })

      $('button:eq(3)').on('click',function(){
        var data= $("input").val();
         if(data){
          $.ajax({
          type:'get',
          url:'/update/'+data,
          success:function(data){
              if(data == 'success'){
                  alert('更新成功蹈矮!');
              }
            }
          });
        }
      })
    </script>
  </body>
</html>
簡易請求頁面

編寫controller和配置router

controller控制器函數(shù)

//* 同等async yeild同等于函數(shù)中的return
module.exports = app => {
  class HomeController extends app.Controller {
    * index() {
      yield this.ctx.render('index.tpl');
    }
    // 新增 同理構(gòu)建基于router對應(yīng)的控制器
    * add() {
      const data = this.ctx.params.data;
      const result = yield this.service.mysql.add(data);
      this.ctx.body =result;
    }

    *del() {
      const data=this.ctx.params.data;
      const result = yield this.service.mysql.del(data);
      this.ctx.body = result;
    }
    
    // 查詢
    *reach() {
      const data=this.ctx.params.data;
      const result=yield this.service.mysql.reach(data);
      this.ctx.body=result;
    }

    *update() {
      const data=this.ctx.params.data;
      const result=yield this.service.mysql.update(data);
      this.ctx.body=result;
    }

  }
  return HomeController;
};

router路由映射砰逻,其請求接口根據(jù)路徑判斷


/**
 * @param {Egg.Application} app - egg application
 */
module.exports = app => {
  app.get('/', 'home.index');
  app.get('/add/:data','home.add');
  app.get('/del/:data','home.del');
  app.get('/get/:data','home.reach');
  app.get('/update/:data','home.update');

};
router對應(yīng)請求地址的參數(shù)名和控制器

app下新建service,中間層處理mysql.js

module.exports=app=>{
    // 接受請求的參數(shù),查詢服務(wù)器,返回對應(yīng)信息
   return class User extends app.Service{
        *add() {}
        *del() {}
        // ...
}

新增數(shù)據(jù)
this.app.mysql.insert('test',{'name'})

*add() {
            const data=this.ctx.params.data;
            // 表格名稱test,數(shù)據(jù)庫名稱在config/config.default.js下已定義
            const result=yield this.app.mysql.insert('test',{
                // 時間優(yōu)化下
                'data':new Date(+new Date()+8*3600*1000).toISOString().replace(/T/g,' ').replace(/\.[\d]{3}Z/,'')  ,
                'name':data
            });
            if(result.serverStatus == 2){
                return 'success';
           }else{
               return "fail";
           }
        }
上傳a1到測試表
刷新查看

刪除數(shù)據(jù)
this.app.mysql.delete('test',{name:data}

            const data = this.ctx.params.data;
            const result=yield this.app.mysql.delete('test',{
                name:data
            })
            console.log('result.affectedRows  '+result.affectedRows)
            if(result.affectedRows==1) {
                return result
            }else{
                return false
            }
        }

查詢數(shù)據(jù)
單條查詢
this.app.mysql.get('test',{ name:'a1'})
條件查詢
this.app.mysql.select('sea_data')

 this.app.mysql.select('sea_data',{
                where: {v_name:data }, // WHERE 條件
                columns: ['v_name','v_pic','v_id'], // 要查詢的表字段
                // orders: [], // 排序方式
                limit:5, 
                offset: 0, // 數(shù)據(jù)偏移量
  })
*reach() {
            const data = this.ctx.params.data;
            // get單條查詢,select多條查詢和全部 0這里表示查全部數(shù)據(jù)
            const result=data==0?yield this.app.mysql.select('sea_data'):yield this.app.mysql.select('sea_data',{
                where: {v_name:data }, // WHERE 條件
                columns: ['v_name','v_pic','v_id'], // 要查詢的表字段
                // orders: [], // 排序方式
                limit:5, 
                offset: 0, // 數(shù)據(jù)偏移量
            })
            if(result) {
                return result;
            }else{
                return {
                    code:'1001',
                    data:'false'
                }
            }
        }

更新數(shù)據(jù)
this.app.mysql.update('test',{ id:'1', 'name':'ceshi'})

*update() {
            const data = this.ctx.params.data;
            console.log('更新數(shù)據(jù)'+data)
            const result=yield this.app.mysql.update('test',{
                id:'1',
                'name':'ceshi'
            })
         
            if(result) {
                return result;
            }else{
                return {
                    code:'1001',
                    data:'false'
                }
            }
        }

service/service.js

module.exports=app=>{
    // 接受請求的參數(shù),查詢服務(wù)器,返回對應(yīng)信息
    return class User extends app.Service{
        *add() {
            const data=this.ctx.params.data;
            // 表格名稱test,數(shù)據(jù)庫名稱在config/config.default.js下已定義
            const result=yield this.app.mysql.insert('test',{
                // 時間優(yōu)化下
                'data':new Date(+new Date()+8*3600*1000).toISOString().replace(/T/g,' ').replace(/\.[\d]{3}Z/,'')  ,
                'name':data
            });
            if(result.serverStatus == 2){
                return 'success';
           }else{
               return "fail";
           }
        }

        *del() {
            const data = this.ctx.params.data;
            const result=yield this.app.mysql.delete('test',{
                name:data
            })
            console.log('result.affectedRows  '+result.affectedRows)
            if(result.affectedRows==1) {
                return result
            }else{
                return false
            }
        }

        *reach() {
            const data = this.ctx.params.data;
            // get單條查詢,select多條查詢和全部 0這里表示查全部數(shù)據(jù)
            const result=data==0?yield this.app.mysql.select('sea_data'):yield this.app.mysql.select('sea_data',{
                where: {v_name:data }, // WHERE 條件
                columns: ['v_name','v_pic','v_id'], // 要查詢的表字段
                // orders: [], // 排序方式
                limit:5, 
                offset: 0, // 數(shù)據(jù)偏移量
            })
            if(result) {
                return result;
            }else{
                return {
                    code:'1001',
                    data:'false'
                }
            }
        }
        
        *update() {
            const data = this.ctx.params.data;
            console.log('更新數(shù)據(jù)'+data)
            const result=yield this.app.mysql.update('test',{
                id:'1',
                'name':'ceshi'
            })
         
            if(result) {
                return result;
            }else{
                return {
                    code:'1001',
                    data:'false'
                }
            }
        }
      
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末泛鸟,一起剝皮案震驚了整個濱河市蝠咆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌北滥,老刑警劉巖刚操,帶你破解...
    沈念sama閱讀 212,080評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異再芋,居然都是意外死亡菊霜,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評論 3 385
  • 文/潘曉璐 我一進(jìn)店門祝闻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來占卧,“玉大人,你說我怎么就攤上這事联喘』眩” “怎么了?”我有些...
    開封第一講書人閱讀 157,630評論 0 348
  • 文/不壞的土叔 我叫張陵豁遭,是天一觀的道長叭喜。 經(jīng)常有香客問我,道長蓖谢,這世上最難降的妖魔是什么捂蕴? 我笑而不...
    開封第一講書人閱讀 56,554評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮闪幽,結(jié)果婚禮上啥辨,老公的妹妹穿的比我還像新娘。我一直安慰自己盯腌,他們只是感情好溉知,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,662評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般级乍。 火紅的嫁衣襯著肌膚如雪舌劳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,856評論 1 290
  • 那天玫荣,我揣著相機(jī)與錄音甚淡,去河邊找鬼。 笑死捅厂,一個胖子當(dāng)著我的面吹牛贯卦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播恒傻,決...
    沈念sama閱讀 39,014評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼脸侥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了盈厘?” 一聲冷哼從身側(cè)響起睁枕,我...
    開封第一講書人閱讀 37,752評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎沸手,沒想到半個月后外遇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,212評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡契吉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,541評論 2 327
  • 正文 我和宋清朗相戀三年跳仿,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捐晶。...
    茶點(diǎn)故事閱讀 38,687評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡菲语,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出惑灵,到底是詐尸還是另有隱情山上,我是刑警寧澤,帶...
    沈念sama閱讀 34,347評論 4 331
  • 正文 年R本政府宣布英支,位于F島的核電站佩憾,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏干花。R本人自食惡果不足惜妄帘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,973評論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望池凄。 院中可真熱鬧抡驼,春花似錦、人聲如沸肿仑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽柏副。三九已至勾邦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間割择,已是汗流浹背眷篇。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留荔泳,地道東北人蕉饼。 一個月前我還...
    沈念sama閱讀 46,406評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像玛歌,于是被迫代替她去往敵國和親昧港。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,576評論 2 349

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