也许是最简单的node egg入门demo

前言:

对于node能实现的后台比较感兴趣,大致看了下node和egg文档,了解了下基本的sql语句开始学习node了,发现教程的确比较少,记录分享一个egg的入门demo。

准备工作

egg-init

安装完node,npm,egg-init,egg-bin后使用egg-init egg-example --type=simple快速搭建项目,然后配置所需要的package.json的文件。页面渲染使用文档中的 Nunjucks ,访问数据库采用 egg-mysql

package.json:

在config/config/plugin.js下开启插件,config/config.default.js下配置关联和数据库信息。

// 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',
          // 数据库名
          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;
};

创建mysql模拟数据表

安装下载mysql,打开mysqlworkbench,初次打开设置密码123456。


新建数据库
新建表注意id自增长,int类型
上传成功

测试预览

npm run dev测试查看,默认127.0.0.1:7001端口。

app下新建view文件夹,新建.tpl文件模拟页面绑定ajax事件

app/view/index.tpl
<html>
  <head>
    <title>Egg Demo</title>
    <link href="https://cdn.bootcss.com/bootstrap/4.0.0/css/bootstrap.css" rel="stylesheet">
  </head>
  <body class="container">
    <input class="form-control" type="text"><br />
    <button class="btn btn-success">上传到数据库</button>
    <button class="btn btn-success">删除</button>
    <button class="btn btn-success">查询对应</button>
    <button class="btn btn-success">更新对应</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控制器函数

//* 同等async yeild同等于函数中的return
module.exports = app => {
  class HomeController extends app.Controller {
    * index() {
      yield this.ctx.render('index.tpl');
    }
    // 新增 同理构建基于router对应的控制器
    * 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路由映射,其请求接口根据路径判断


/**
 * @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对应请求地址的参数名和控制器

app下新建service,中间层处理mysql.js

module.exports=app=>{
    // 接受请求的参数,查询服务器,返回对应信息
   return class User extends app.Service{
        *add() {}
        *del() {}
        // ...
}

新增数据
this.app.mysql.insert('test',{'name'})

*add() {
            const data=this.ctx.params.data;
            // 表格名称test,数据库名称在config/config.default.js下已定义
            const result=yield this.app.mysql.insert('test',{
                // 时间优化下
                '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到测试表
刷新查看

删除数据
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
            }
        }

查询数据
单条查询
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, // 数据偏移量
  })
*reach() {
            const data = this.ctx.params.data;
            // get单条查询,select多条查询和全部 0这里表示查全部数据
            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, // 数据偏移量
            })
            if(result) {
                return result;
            }else{
                return {
                    code:'1001',
                    data:'false'
                }
            }
        }

更新数据
this.app.mysql.update('test',{ id:'1', 'name':'ceshi'})

*update() {
            const data = this.ctx.params.data;
            console.log('更新数据'+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=>{
    // 接受请求的参数,查询服务器,返回对应信息
    return class User extends app.Service{
        *add() {
            const data=this.ctx.params.data;
            // 表格名称test,数据库名称在config/config.default.js下已定义
            const result=yield this.app.mysql.insert('test',{
                // 时间优化下
                '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这里表示查全部数据
            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, // 数据偏移量
            })
            if(result) {
                return result;
            }else{
                return {
                    code:'1001',
                    data:'false'
                }
            }
        }
        
        *update() {
            const data = this.ctx.params.data;
            console.log('更新数据'+data)
            const result=yield this.app.mysql.update('test',{
                id:'1',
                'name':'ceshi'
            })
         
            if(result) {
                return result;
            }else{
                return {
                    code:'1001',
                    data:'false'
                }
            }
        }
      
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容