精华内容
下载资源
问答
  • eggjs

    2020-11-05 11:48:00
    https://eggjs.org/zh-cn/intro/quickstart.html 安装介绍 1.初始化 $ mkdir egg-example && cd egg-example $ npm init egg --type=simple $ npm i 2.启动项目 $ npm run dev $ open http:

    特性

      1.提供基于egg定制上层框架的能力
      2.高度扩展性插件机制
      3.内置多进程管理
      4.基于koa开发性能优异
      5.框架稳定.测试覆盖率高
      6.渐进式开发
    

    官网

    https://eggjs.org/zh-cn/intro/quickstart.html
    

    安装介绍

      1.初始化
      $ mkdir egg-example && cd egg-example
      $ npm init egg --type=simple
      $ npm i
      2.启动项目
      $ npm run dev
      $ open http://localhost:7001
      3.目录介绍
      app目录为主文件,数据库操作 业务逻辑
      config 针对egg插件配置
      test 单元测试 
      .autod.conf autod配置文件
    

    路由 router

    路由

      module.exports = app => {
      const { router, controller } = app;
      router.get('/', controller.home.index);
      router.get('/product',controller.product.index);
    };
    

    请求两种传参方式
    query

        ctx.body = `ctx.query ${ctx.query.id}`
    

    params

    需要在路由配置
    router.get('/product/detail2/:id',controller.product.detail2);  
    ctx.body = `ctx.params ${ctx.params.id}`
    

    其他请求方式

    service服务
      1.controller中逻辑更加简洁
      2.保持业务逻辑的独立性,抽象出来的service可以被多个controller重复调用
      3.将逻辑和展现分离,更容易编写测试用例
    

    模板使用
    安装插件

      npm i egg-view-ejs --save
      地址
      https://www.npmjs.com/package/egg-view-ejs
    

    前端系统搭建

    	vue/cli  3.0
    	vue下载 
    	npm install -g @vue/cli
    	版本号 
    	vue --version 
    	帮助
    	vue --help
    	生成
    	vue create clint(name)
    	组件库
    	npm install --save vent
    
    	官网
    	https://youzan.github.io/vant-weapp/#/intro
    

    后端开发

    链接mysql

    安装  egg-mysql
    npm i --save egg-mysql
    

    开启插件
    // config/plugin.js
    exports.mysql = {
    enable: true,
    package: ‘egg-mysql’,

    }; 链接数据库

    单数据源

    路径 config/config.default.js
    // config/config.${env}.js
    exports.mysql = {
      // 单数据库信息配置
      client: {
        // host
        host: 'mysql.com',
        // 端口号
        port: '3306',
        // 用户名
        user: 'test_user',
        // 密码
        password: 'test_password',
        // 数据库名
        database: 'test',
      },
      // 是否加载到 app 上,默认开启
      app: true,
      // 是否加载到 agent 上,默认关闭
      agent: false,
    };
    

    post请求 scrf

    在config/config.default.js 加入
      config.security = {
        csrf: {
          enable: false,
        },
      };
    

    moment 时间处理插件
    npm
    cnpm i --save moment

    前后段联调
    1创建前端代理

    module.exports ={
    devServer:{
    proxy:{
    ‘/article’:{ // 如果检测到以article 开头的请求的时候,就将代理到目标服务器上去
    target:“http://lcoalhost:7001”,
    ws:true, // 允许 websoket请求
    changeOrgin:true //开启虚拟服务器,并且让虚拟服务器请求代理服务器,这样相当于两台服务器间的交互不用担心跨域问题
    }
    }
    }
    }

    展开全文
  • eggJS

    2019-07-01 15:01:19
    什么是eggJS Node.js的一个库,是基于koa的库

    什么是eggJS

    Node.js的一个库,是基于koa的库
    官网链接:https://eggjs.org/zh-cn/intro/quickstart.html
    参考视频:https://www.bilibili.com/video/av38372787/?p=9
    在这里插入图片描述

    MVC

    service(model): 模型 和数据打交道(查询数据库 请求数据等)
    view:视图层 页面展示/模板
    controller:控制器,负责处理一些业务逻辑
    在这里插入图片描述

    路由

    传值方式:
    ①get传值: …/testParam?name=123

     // router.js
    router.get('/test', controller.home.test);
    //通过  `this.ctx.query` 来获取
    

    ②动态路由: …/testParam/123

    // router.js
    router.get('/testParam/:id', controller.home.testParam);
    // controller  
    // 通过  `this.ctx.params` 来获取
    

    控制器

    定义的 Controller 类,会在每一个请求访问到 server 时实例化一个全新的对象,而项目中的 Controller 类继承于 egg.Controller,会有下面几个属性挂在 this 上。

    • this.ctx: 当前请求的上下文 Context 对象的实例,通过它我们可以拿到框架封装好的处理当前请求的各种便捷属性和方法。
    • this.app: 当前应用 Application 对象的实例,通过它我们可以拿到框架提供的全局对象和方法。
    • this.service:应用定义的 Service,通过它我们可以访问到抽象出的业务层,等价于 this.ctx.service 。
    • this.config:应用运行时的配置项。
    • this.logger:logger 对象,上面有四个方法(debug,info,warn,error),分别代表打印四个不同级别的日志,使用方法和效果与 context logger 中介绍的一样,但是通过这个 logger 对象记录的日志,在日志前面会加上打印该日志的文件路径,以便快速定位日志打印位置。

    post提交的CSRF安全机制

     - 方法一:
    

    例如在home页面中有个表单提交:应该在渲染前加上这个字段,在post时,中间件的时候会自动校验
    在这里插入图片描述
    在这里插入图片描述
    上面这个也可以写成下面的形式
    在这里插入图片描述
    - 方法二:在每个用户访问的时候,中间件给它设计一个全局变量
    变成全局变量:
    在中间件中:新建auth.js :
    在这里插入图片描述
    在这里插入图片描述

    cookie

    实现不同页面的数据共享:
    this.ctx.cookie.set()
    this.ctx.cookie.get()
    在这里插入图片描述

    展开全文
  • Eggjs

    2019-11-06 14:33:15
    如果了解java的可以看出eggjs的项目目录结构以及处理请求的模式和javaweb很像,controller,service,view;不陌生的是都是MVCde 开发模式,不同就是如何拿数据给请求者 项目目录 app文件夹: 项目开发...

    Egg.js

    简介

    Egg.js 为企业级框架和应用而生,帮助开发团队和开发人员降低开发和维护成本。

    专注于提供 Web 开发的核心功能和一套灵活可扩展的插件机制,不会做出技术选型,因为固定的技术选型会使框架的扩展性变差,无法满足各种定制需求。

    Egg 的插件机制有很高的可扩展性,一个插件只做一件事,Egg 通过框架聚合这些插件,并根据自己的业务场景定制配置,这样应用的开发成本就变得很低。

    Egg 奉行『约定优于配置』,按照一套统一的约定进行应用开发,Egg 有很高的扩展性,可以按照团队的约定定制框架。使用 Loader 可以让框架根据不同环境定义默认配置,还可以覆盖 Egg 的默认约定。

    特性

    • 提供基于 Egg 定制上层框架的能力
    • 高度可扩展的插件机制
    • 内置多进程管理
    • 基于 Koa 开发,性能优异
    • 框架稳定,测试覆盖率高
    • 渐进式开发(根据设备的支持情况来提供更多功能,提供离线能力,推送通知,甚至原生应用的外观和速度,以及对资源进行本地缓存。)

    Egg和koa

    如上述,Koa 是一个非常优秀的框架,然而对于企业级应用来说,它还比较基础。

    而 Egg 选择了 Koa 作为其基础框架,在它的模型基础上,进一步对它进行了一些增强。

    • 在 Express 和 Koa 中,经常会引入许许多多的中间件来提供各种各样的功能,而 Egg 提供了一个更加强大的插件机制,让这些独立领域的功能模块可以更加容易编写。
      • extend:扩展基础对象的上下文,提供各种工具类、属性。
      • middleware:增加一个或多个中间件,提供请求的前置、后置处理逻辑。
      • config:配置各个环境下插件自身的默认配置项。
      • 一个独立领域下的插件实现,可以在代码维护性非常高的情况下实现非常完善的功能,而插件也支持配置各个环境下的默认(最佳)配置,让我们使用插件的时候几乎可以不需要修改配置项。

    快速搭建环境

    • 运行环境

      • 建议选择Node.js稳定版本,最低要求 8.x
    • 初始化项目

      • npm init egg --type=simple   //--type=simple可以去掉然后自己配置
        cd demo
        npm install
        
    • 启动项目

      • npm run dev
        浏览器打开:localhost:7001
        

    注意:实际项目中,推荐使用脚手架直接初始化,所以这里不做手动初始化项目了。

    • 如果了解java的可以看出eggjs的项目目录结构以及处理请求的模式和javaweb很像,controller,service,view;不陌生的是都是MVCde 开发模式,不同就是如何拿数据给请求者

    • 项目目录

      • app文件夹:
        	项目开发文件,程序员主要操作的文件,项目的大部分代码都会写在这里。
        config文件夹:
        	这个是整个项目的配置目录,项目和服务端的配置都在这里边进行设置。
        logs文件夹:
        	日志文件夹,正常情况下不用修改和查看里边内容。
        node_modules:
        	项目所需要的模块文件,这个前端应该都非常了解,不多作介绍。
        run文件夹:
        	运行项目时,生成的配置文件,基本不修改里边的文件。
        test文件夹:
        	测试使用的配合文件,这个在测试时会使用。
        .autod.conf.js: 
        	egg.js自己生成的配置文件,不需要进行修改。
        eslinttrc和eslintignore:
        	代码格式化的配置文件。
        gitgnore:
        	git设置忽略管理的配置文件。
        package.json:
        	包管理和命令配置文件,这个文件经常进行配置。
        
      • app目录中

        controller文件夹:
        	控制器,渲染和简单的业务逻辑都会写道这个文件里。配置路由时也会用到(路由配置需要的文件都要写在控制器里)。
        public文件夹:
        	公用文件夹,把一些公用资源都放在这个文件夹下。
        router.js: 
        	项目的路由配置文件,当用户访问服务的时候,在没有中间件的情况下,会先访问router.js文件。
        service文件夹:
        	这个是当我们的业务逻辑比较复杂或和数据库打交道时,会把业务逻辑放到这个文件中。
        view文件夹:
        	模板文件夹,相当于表现层的专属文件夹,这个项目,我们使用接口的形式,所以不需要建立view文件夹。
        extend文件:
        	当我们需要写一些模板中使用的扩展方法时,我们会放到这个文件夹里。
        middleware:
        	中间件文件夹,用来写中间件的,比如最常用的路由首位。
        

    扩展插件

    在基于 Egg 的框架或者应用中,我们可以通过定义 app/extend/{application,context,request,response}.js
    这里表示可以创建application,context,request,response四个js文件

    来扩展 Koa 中对应的四个对象的原型,通过这个功能,我们可以快速的增加更多的辅助方法,例如我们在 app/extend/context.js 中写入下列代码:

    // ./app/extend/context.js
    module.exports = {
      get isIOS() {//get表示通过这个isIOS得到什么记得添加
        const iosReg = /iphone|ipad|ipod/i;//正则
        return iosReg.test(this.get('user-agent'));
          //User Agent显示使用的浏览器类型及版本、操作系统及版本、浏览器内核、等信息的标识。
      },
    };
    

    在 Controller 中,我们就可以使用到刚才定义的这个便捷属性了:

    // ./app/controller/home.js
    const Controller = require('egg').Controller;//从egg上引入控制器
    class HomeController extends Controller {//声明一个类并从constroller继承
        async index() {//声明一个函数
            this.ctx.body = this.ctx.isIOS
                ? '你的操作系统是IOS.'
                : '你的操作系统不是IOS.';
        }
    }
    module.exports = HomeController;//把这个类默认暴露出去
    
    • 静态资源

      • Egg 内置了static插件static 插件默认映射 app/public/ 目录,我们把静态资源都放到 app/public 目录即可:
    • 模板渲染

      • 框架并不强制你使用某种模板引擎,只是约定了 View 插件开发规范,开发者可以引入不同的插件来实现差异化定制。
    • 更多用法参见 View,在本例中,我们使用 Nunjucks 来渲染,先安装对应的插件 egg-view-nunjucks

    npm i egg-view-nunjucks --save
    

    开启插件:

    // ./config/plugin.js
    exports.nunjucks = {
      enable: true,//使用
      package: 'egg-view-nunjucks'//使用什么插件
    };
    // ./config/config.default.js
    exports.keys = '此处改为你自己的 Cookie 安全字符串';
    // 添加 view 配置
    exports.view = {
      defaultViewEngine: 'nunjucks',//默认视图引擎
      mapping: {//.tpl结尾的文件
        '.tpl': 'nunjucks',
      },
    };
    

    为列表页编写模板文件,一般放置在 ./app/view 目录下

    <!-- ./app/view/news/list.tpl -->
    <!-- {% %} 来当做模板,与现有的html标记混用。和php干的事情是一样的。-->
    <html>
      <head>
        <title>Hacker News</title>
        <link rel="stylesheet" href="/public/css/news.css" />
      </head>
      <body>
        <ul class="news-view view">
          {% for item in list %}<!-- 这里可以直接拿到dataList中的list但无法拿到dataList -->
            <li class="item">
              <a href="{{ item.url }}">{{ item.title }}</a>
            </li>
          {% endfor %}<!-- 结束for循环 -->
        </ul>
      </body>
    </html>
    

    添加 Controller 和 Router

    // ./app/controller/news.js
    const Controller = require('egg').Controller;
    class NewsController extends Controller {
      async list() {
        const dataList = {
          list: [
            { id: 1, title: 'this is news 1', url: '/news/1' },
            { id: 2, title: 'this is news 2', url: '/news/2' }
          ]
        };
        await this.ctx.render('news/list.tpl', dataList);
          //渲染list.tpl文件且把dataList的内容传过去
      }
    }
    
    module.exports = NewsController;
    // ./app/router.js
    module.exports = app => {
      const { router, controller } = app;
      router.get('/', controller.home.index);
      router.get('/news', controller.news.list);
    };
    

    启动浏览器,访问 http://localhost:7001/news 即可看到渲染后的页面。

    • 编写 service
      • 在实际应用中,Controller 一般不会自己产出数据,也不会包含复杂的逻辑,复杂的过程应该交给业务逻辑层 Service

    我们来添加一个 Service 抓取页面的数据 ,如下:这里只是demo写法,根据实际情况再改变

    // ./app/service/news.js
    const Service = require('egg').Service;
    class NewsService extends Service {
      async list(page) {//得到传来的页码参数
        // 读取配置拿到API接口
        const { serverUrl } = this.config.news;
    
        //使用内置的curl发出请求拿回数据
        //结构出来result,在这里给他改名叫做idList
        const { result: idList } = await this.ctx.curl(`${serverUrl}/topstories.json`, {
          data: {//携带信息
            orderBy: '"$key"',//根据什么排序
            startAt: `${page}`,//起始页
            endAt: `${page+1}`,//结束页
          },
          dataType: 'json',//需要返回的数据类型
        });
    
        // 获取详细信息
        const newsList = await Promise.all(
            //获取对象的所有键名
          Object.keys(idList).map(key => {
            const url = `${serverUrl}/item/${idList[key]}.json`;
            return this.ctx.curl(url, { dataType: 'json' });//再去请求每一个的详细信息
          })
        );
        return newsList.map(res => res.data);//把每一条的数据的data返回出去。
      }
    }
    module.exports = NewsService;
    

    框架提供了内置的 HttpClient 来方便开发者使用 HTTP 请求。
    this.ctx.curl(api地址:string,配置:json)

    然后稍微修改下之前的 Controller:

    // ./app/controller/news.js
    const Controller = require('egg').Controller;
    
    class NewsController extends Controller {
      async list() {
        const ctx = this.ctx;
        const page = ctx.query.page || 1;//获取用户url里面的page值没有就返回1
        const newsList = await ctx.service.news.list(page);//传过去,声明newsList接受return回来的数据
        await ctx.render('news/list.tpl', { list: newsList });//把list传过去,他的数据是newsList
      }
    }
    module.exports = NewsController;
    

    还需增加 app/service/news.js 中读取到的配置:

    // ./config/config.default.js
    // 添加 news 的配置项
    exports.news = {
      serverUrl: 'API接口地址'
    };
    
    • 编写扩展

      • 如果时间的数据是 UnixTime 格式的,我们希望显示为便于阅读的格式。框架提供了一种快速扩展的方式,只需在 app/extend 目录下提供扩展脚本即可,具体参见扩展。在这里,我们可以使用 View 插件支持的 Helper 来实现:

        npm i moment --save
        // ./app/extend/helper.js
        const moment = require('moment');
        exports.relativeTime = time => moment(new Date(time * 1000)).fromNow();
        
    • 在模板里面使用:

      <!-- ./app/view/news/list.tpl -->
      <html>
        <head>
          <title>Hacker News</title>
          <link rel="stylesheet" href="/public/css/news.css" />
        </head>
        <body>
          <ul class="news-view view">
            {% for item in list %}
              <li class="item">
                <a href="{{ item.url }}">{{ item.title }}</a>
              </li>
            {% endfor %}
            {{ helper.relativeTime(item.time) }}<!--通过这样的方法使用 -->
          </ul>
        </body>
      </html>
      
    • 编写中间

      • 假设我们的新闻站点,禁止百度爬虫访问。可以通过 Middleware 判断 User-Agent,如下:

        // ./app/middleware/robot.js
        // options === app.config.robot //这里的robot是这个文件的名字
        module.exports = (options, app) => {
          return async function robotMiddleware(ctx, next) {
            const source = ctx.get('user-agent') || '';
            const match = options.ua.some(ua => ua.test(source));
            //some()会让ua数组中的每一项去执行()里面的函数,如果有一个元素满足条件,则表达式返回true , 剩余的元素不会再执行检测。
            if (match) {
              ctx.status = 403;
              ctx.message = 'Go away, robot.';//别用中文
            } else {
              await next();//放行
            }
          }
        };
        // ./config/config.default.js
        // 添加中间件
        exports.middleware = [
          'robot'
        ];
        // 添加配置
        exports.robot = {
          ua: [
            /Baiduspider/i,
          ]
        };
        

    现在可以使用 curl http://localhost:7001/news -A "Baiduspider" 看看效果。

    如果你是window用户在CMD下是无法执行此命令的,推荐你安装Git Bash运行此命令

    • 配置文件

      写业务的时候,不可避免的需要有配置文件,框架提供了强大的配置合并管理功能:

      • 支持按环境变量加载不同的配置文件,如 config.local.jsconfig.prod.js 等等。
      • 应用/插件/框架都可以配置自己的配置文件,框架将按顺序合并加载。
      • 具体合并逻辑可参见配置文件
    // ./config/config.default.js
    // 这里是默认值
    exports.robot = {
      ua: [
        /curl/i,
        /Baiduspider/i,
      ],
    };
    // ./config/config.local.js
    // 仅在开发模式下读取,将覆盖默认值
    exports.robot = {
      ua: [
        /Baiduspider/i,
      ],
    };
    // ./app/service/some.js
    const Service = require('egg').Service;
    
    class SomeService extends Service {
      async list() {
        const rule = this.config.robot.ua;// /Baiduspider/i,
      }
    }
    module.exports = SomeService;
    
    • 单元测试

    单元测试非常重要,框架也提供了 egg-bin 来帮开发者无痛的编写测试。

    测试文件应该放在项目根目录下的 test 目录下,并以 test.js 为后缀名,即 ./test/**/*.test.js

    **表示任何文件夹
    *表示任何文件

    npm i egg-mock --save-dev
    

    然后配置依赖和 npm scripts配置:

    {
      "scripts": {
        "test": "egg-bin test",
      }
    }
    // ./test/app/middleware/robot.test.js
    const { app, mock, assert } = require('egg-mock/bootstrap');
    //他会去找到./app/middleware/robot.js进行测试
    describe('test/app/middleware/robot.test.js', () => {
      it('阻止机器人爬虫', () => {
        return app.httpRequest()
          .get('/')
          .set('User-Agent', "Baiduspider")
          .expect(403);
      });
    });
    
    展开全文
  • 前言国有国法,家有家规,当我们一群人共同在做...eggjs是一个nodejs框架,继承与koa框架,egg.js为企业级框架和应用而生,所奉行的宗旨约定优于配置,按照一套统一的约定进行开发。安装环境要求nodejs环境最低要求...

    前言

    国有国法,家有家规,当我们一群人共同在做一件事情时,如果不加以约束,每个人做事的方式就会按照自己喜爱的方式进行,凌乱不堪,让后来加入者需要更多的时间,熟悉前人所做事情,然而所做的事情也是凌乱不堪的,我们为何不加以约束。

    eggjs是一个nodejs框架,继承与koa框架,egg.js为企业级框架和应用而生,所奉行的宗旨约定优于配置,按照一套统一的约定进行开发。

    安装

    环境要求nodejs环境最低要求8.x

    安装脚手架$ mkdir egg-example && cd egg-example

    $ npm init egg --type=simple

    $ npm i复制代码

    官网也有逐步搭建过程

    目录结构约束egg-project

    ├── package.json

    ├── app.js (可选)

    ├── agent.js (可选)

    ├── app

    |   ├── router.js

    │   ├── controller

    │   |   └── home.js

    │   ├── service (可选)

    │   |   └── user.js

    │   ├── middleware (可选)

    │   |   └── response_time.js

    │   ├── schedule (可选)

    │   |   └── my_task.js

    │   ├── public (可选)

    │   |   └── reset.css

    │   ├── view (可选)

    │   |   └── home.tpl

    │   └── extend (可选)

    │       ├── helper.js (可选)

    │       ├── request.js (可选)

    │       ├── response.js (可选)

    │       ├── context.js (可选)

    │       ├── application.js (可选)

    │       └── agent.js (可选)

    ├── config

    |   ├── plugin.js

    |   ├── config.default.js

    │   ├── config.prod.js

    |   ├── config.test.js (可选)

    |   ├── config.local.js (可选)

    |   └── config.unittest.js (可选)

    └── test

    ├── middleware

    |   └── response_time.test.js

    └── controller

    └── home.test.js复制代码

    内置基础对象

    eggjs框架从koa框架继承了四个对象(Application,Context,Request,Response),框架本身也扩展了一些对象(Controller,Service,helper,Config,Looger)

    Application对象

    Application是一个全局对象,只会实例化一个,Application对象继承koa.Application对象,在上面可以挂载一些全局的方法和属性

    简单使用

    我们用业务来表述技术的使用,例如我们现在有一个记账的业务。

    router

    首先我们要有api接口,当我们有多个api接口时,怎么做区分? 使用router路由进行分发请求。我们在app文件下面创建router.js文件,通过从Application对象中结构出router来使用路由的功能// router.js module.exports = app => {  const { router, controller, jwt } = app;  // 登陆接口

    router.get('/keeping/api/v1/login', controller.login.login);  // 查询用户

    router.get('/keeping/api/v1/getUser', jwt, controller.user.selectUser);

    };// 第一个参数是访问的地址,第二个参数告诉我们匹配成功后分发到相应的controller上,复制代码

    costroller

    当我们分发到相应的controller上进行解析用户的输入,处理后返回相应的结果。

    在app下新建controller.js文件,拿到用户的输入值,我们会把业务逻辑做一个拆分,会调用相应业务逻辑,就是我们所说的service// controller.jsconst { Controller } = require('egg');class LoginController extends Controller {  // 登陆api

    async login() {const { ctx, app } = this;     // 拿到用户的输入值const query = ctx.query;// 调用service服务const loginInfo = await ctx.service.login.login(query);   // 生成token const token = app.jwt.sign({      user: loginInfo,

    }, app.config.jwt.secret);const openid = loginInfo.openid;// 返回值ctx.body = {

    openid,      token: `Bearer ${token}`,      success: '登陆成功',      code: 200,

    };

    }  // 查询用户

    async selectUser() {const { ctx } = this;const query = ctx.query;console.log(query, '........query======');const user = await ctx.service.user.selectUser(query);if (user) {      this.ctx.body = {success: true,message: '查询成功',status: 200,data: user,

    };

    } else {      this.ctx.body = {success: false,message: '查询失败',status: 40023,

    };

    }

    }

    }module.exports = LoginController;复制代码

    service

    controller调用service业务逻辑,我们在app文件下新建service文件,在service文件下编写抽离出来的业务逻辑的封装,把业务逻辑抽离出来使我们的controller更加的简洁,保持业务的独立性,抽离出来的service可以被多个controller使用。// service.jsconst { Service } = require('egg');class LoginService extends Service {  // 登陆

    async login(data) {const { app, ctx } = this;     // 这里我通过在config下面配置常量,通过引用调用,此接口是登陆接口const { appid, secret } = app.config.weapp;const result = await ctx.curl(`https://api.weixin.qq.com/sns/jscode2session?appid=${appid}&secret=${secret}&js_code=${data.code}&grant_type=authorization_code`, { dataType: 'json' });const aa = await ctx.service.user.selectUser(result.data);if (!aa) {      await ctx.service.user.addUser({ openid: result.data.openid });

    }return result.data;

    }

    // 查询用户

    async selectUser(openid) {const { app } = this;const userTable = app.config.sqlTable.user;const user = await app.mysql.get(userTable, openid);return user;

    }

    }module.exports = LoginService;复制代码

    config

    当我们需要使用数据库时,我们就要使用plugin,例如我们使用mysql数据库,需要安装egg-mysql,安装后在config/plugin.js中声明:// 配置mysql

    mysql: {enable: true,package: 'egg-mysql',

    },复制代码

    然后在config/config.default.js中配置数据库连接的相关配置// 配置mysql

    config.mysql = {// 单数据库信息配置client: {      host: 'localhost', //主机名  port: '3306',//端口号  user: 'root',// 数据库用户名  password: '123456', // 数据库密码  database: 'xilou', //数据库表名},// 是否加载到 app 上,默认开启app: true,agent: false,

    };复制代码

    后续会配置一些解决跨域的egg-cors插件,生成token的egg-jwt插件,配置如mysql一样,这样一个流程就完成了,我们使用postman进行请求下,因为数据库我已经配置好,现在进行查询用户的一个请求,数据库里面的数据是我已经插入进去的,查询用户如下

    368b6c65e333920939e69e087ddf6028.png

    中间件

    我们可以自己编写中间件,放在app/middleware文件下面,在config.default.js下面配置中间件

    总结

    上面阐述了eggjs的基本使用。

    eggjs对开发团队进行约定,有利于团队开发,减少开发人员的学习成本,开箱即用。eggjs使用路由分发请求,具体执行的动作

    使用controller负责解析用户的输入,处理返回相应的结果

    使用service处理相应的业务逻辑

    因为nodejs是异步,采用async来进行处理

    其他的无非使用插件来增强功能,例如连接数据库,要么使用中间件来增强功能,通过挂载在Application下使用

    如果有哪些言辞不正之处,错误之处,欢迎指正,后续会进行更改

    展开全文
  • Eggjs小试

    2018-06-15 19:40:50
    项目都很小,但为了进一步了解Eggjs,特意选择了Eggjs作为框架基础开发后端服务。期间也遇到过一些问题和坑,还有几个值得注意的点,下面来讲一下我这段时间开发的总结。 Egg.js 为企业级框架和应用而生 ,我们...
  • linux eggjs项目发布配置
  • <div><p>The eggjs is the famous web framework that purpose to build better enterprise framework and apps. And Skywalking intent to support trace eggjs framework in next 0.2.0 version. </p><p>该提问...
  • eggjs框架学习心得

    2021-05-01 16:41:28
    本文主要介绍一些本人对eggjs的学习心得, 也建议初学者从官网教程进行学习,然后找开源项目进行仿照实战。 eggjs框架目录结构 官网的目录结构介绍缺了不少,以下是我整理的eggjs框架目录结构。 ...
  • eggjs异常捕获机制

    2021-04-17 11:37:35
    eggjs异常捕获机制
  • eggjs入坑指南

    2018-10-10 17:18:35
    目前笔者的主业是vue写网页,闲来无事想玩玩node后端,在经过多重比较下,选择了阿里的eggjs框架,目前属于刚入坑状态,由于感觉官方的文档亲民性差很多,因此准备开始着手eggjs入坑指南,给刚入坑的同学们一些好的...
  • eggjs后台debug问题

    2020-12-06 09:37:15
    <div><p>我看到在eggjs中,可以通过egg-bin debug启动,然后可以在vscode中断点调试,使用了这个框架,如何debug呢?</p><p>该提问来源于开源项目:easy-team/egg-vue-webpack-...
  • eggjs源码分析

    千次阅读 2017-11-15 15:20:37
    根据代码启动顺序分析了eggjs的源码
  • OAuth授权服务器的nod​​ejs基于eggjs实现 快速开始 有关更多详细信息,请参见 。 发展历程 $ npm i $ npm run dev $ open http://localhost:7001/ 部署 $ npm start $ npm stop npm脚本 使用npm run lint检查代码...
  • eggJS开发微信公众号

    千次阅读 2020-02-19 15:02:08
    eggjs开发微信公众号 搭建eggjs框架 $ npm i egg-init -g $ egg-init wechat_public_number_demo --type=simple $ cd wechat_public_number_demo $ npm install $ npm run dev $ open http://127.0.0.1:7001/ 将...
  • egg:一个Eggjs后端项目
  • eggjs 跨域访问

    2019-10-12 19:35:13
    eggjs 跨域访问 背景 因为前端项目是Vue构建,为了方便调试,故而设置可跨域访问。 步骤 1.添加插件 egg-cors。 npm i egg-cors -S 2.启用插件 egg-cors: 在 plugin.js 中: exports.cors = { enable: true, ...
  • Eggjs学习笔记

    2019-12-16 15:11:34
    原文链接 https://eggjs.org/zh-cn/intro/index.html 是什么 Egg.js 为企业级框架和应用而生 与社区框架的差异 Express 是 Node.js 社区广泛使用的框架,简单且扩展性强,非常适合做个人项目。但框架本身缺少约定,...
  • eggJS 入门分享

    千次阅读 2019-05-08 11:30:18
    eggJS入门分享 快速初始化 我们推荐直接使用脚手架,只需几条简单指令,即可快速生成项目: $ mkdir egg-example && cd egg-example$ npm init egg --type=simple$ npm i 启动项目: $ npm run ...
  • 刚开始接触eggjs框架,然后想实现一个简单的界面输入数据,通过egg框架讲数据简单的储存到数据库中,但是搜到的都是官网上的介绍,没有实际操作。然后就自己摸索着写了试试,遇见了许多的坑终于~~。 官方教程:...
  • EggJs快速入门

    2019-05-13 21:04:00
    EggJs快速入门 Egg.js 简介 Egg.js 为企业级框架和应用而生,帮助开发团队和开发人员降低开发和维护成本。 专注于提供 Web 开发的核心功能和一套灵活可扩展的插件机制,不会做出技术选型,因为固定...
  • eggJS文件上传

    千次阅读 2018-09-20 20:39:03
    最近项目在做一个上传头像到nginx搭建的静态服务器,用的是eggJS 下面是整个流程 1. 设置路由 app.router.post('/uploadAvator', checkAdminLogin, app.controller.upload.uploadAvatorController.uploadAvator)...
  • eggjs断点调试

    千次阅读 2018-02-10 10:54:33
    eggjs 断点调试 第一步 编辑launch.json 点击左边竖排的第四个(中间有蜘蛛的那个图标) 点击左边文件launch上调试的下来添加配置,会自动生成launch.json 配置为 { "version": "0.2.0&...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,856
精华内容 742
关键字:

eggjs