Egg.js快速入门

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: Egg.js快速入门

Egg.js

基于Node.js和Koa企业级应用开发框架

特性

提供基于Egg的定制上层框架的能力

高度可扩展的插件机制

内置多进程管理

基于Koa开发性能优异

框架稳定,测试覆盖率搞

渐进式开发

涉及内容

vant ui

vue-cli3

moment.js

Egg.js

mysql

前后端联调

开发环境

Egg.js

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

$ node -v
v10.16.0
$ mkdir egg-demo && cd egg-demo
$ npm init egg --type=simple
$ cnpm i
$ npm run dev

http://127.0.0.1:7001/

路由

app/router.js

'use strict';
/**
 * @param {Egg.Application} app - egg application
 */
module.exports = app => {
  const { router, controller } = app;
  router.get('/', controller.home.index);
};

GET传参

1、方式一

/product/detail?id=110

// 路由
router.get('/product/detail', controller.product.detail);
// 控制器
async detail() {
    const { ctx } = this;
    console.log(ctx.query); // { id: '110' }
    ctx.body = `id=${ctx.query.id}`;
}

2、方式二

/product/detail2/110

// 路由
router.get('/product/detail2/:id', controller.product.detail2);
// 控制器
async detail2() {
    const { ctx } = this;
    console.log(ctx.params); // { id: '110' }
    ctx.body = `id=${ctx.params.id}`;
}

POST请求

// 配置文件关闭csrf
config.security = {
    csrf: {
      enable: false,
    },
  };
// 路由
router.post('/product/create', controller.product.create);
// 控制器
async create() {
    const { ctx } = this;
    console.log(ctx.request.body); // { name: 'Tom' }
    const {name, age} = ctx.request.body;
    ctx.body = {name, age};
  }

POST请求 /product/create

Content-Type application/x-www-form-urlencoded
Content-Type application/json
name: "Tom"

返回

{
    "name": "Tom"
}

PUT请求

/product/update/110

// 路由
router.put('/product/update/:id', controller.product.update);
// 控制器
async update() {
    const { ctx } = this;
    console.log(ctx.params); // { id: '110' }
    ctx.body = {id: ctx.params.id};
  }

DELETE请求

/product/delete/110

// 路由
router.delete('/product/delete/:id', controller.product.delete);
// 控制器
async delete() {
    const { ctx } = this;
    console.log(ctx.params); // { id: '110' }
    ctx.body = {
        id: ctx.params.id
    };
  }

Service

app/service/product.js

'use strict';
const Service = require('egg').Service;
class productService extends Service {
  async index() {
      return {
          name: "Tom",
          age: 18
      };
  }
}
module.exports = productService;
// 路由
router.get('/product', controller.product.index);
// 修改控制器使用service
async index() {
    const { ctx } = this;
    const res = await ctx.service.product.index();
    ctx.body = res;
  }

访问后返回: /product/

{
    "name": "Tom",
    "age": 18
}

模板引擎

ejs https://github.com/eggjs/egg-view-ejs

$ npm i egg-view-ejs

语法参考

https://ejs.bootcss.com/

修改配置

// {app_root}/config/plugin.js
exports.ejs = {
  enable: true,
  package: 'egg-view-ejs',
};
// {app_root}/config/config.default.js
config.view = {
  mapping: {
    '.html': 'ejs',
  },
};

新建文件

app/view/index.html

<%# 变量 #%>
<%=res.name%>
<%=res.age%>
<%# for循环 #%>
<% for(var i=0; i<list.length; i++){ %>
  <p><%=list[i]%></p>    
<% } %>

控制器中渲染

async index() {
    const { ctx } = this;
    const res = await ctx.service.product.index();
    // ctx.body = res;
    await ctx.render('index.html', {
      res,
      list: ['red', 'green', 'blue']
    })
  }

静态资源

app/public目录树

app
  ├── public
      ├── css
      │   └── main.css
      ├── img
      │   └── demo.png
      └── js
          └── main.js
<!-- 引入css文件 -->
<link rel="stylesheet" href="/public/css/main.css">
<!-- 引入图片资源 -->
<img src="/public/img/demo.png" alt="">
<!-- 引入js文件 -->
<script src="/public/js/main.js"></script>

mysql插件

npm i --save egg-mysql

修改配置

// config/plugin.js
exports.mysql = {
  enable: true,
  package: 'egg-mysql',
};
// config/config.default.js
config.mysql = {
    // 单数据库信息配置
    client: {
      // host
      host: '127.0.0.1',
      // 端口号
      port: '3306',
      // 用户名
      user: 'root',
      // 密码
      password: '123456',
      // 数据库名
      database: 'data',
    },
    // 是否加载到 app 上,默认开启
    app: true,
    // 是否加载到 agent 上,默认关闭
    agent: false,
  };

查询

async index() {
    const { ctx, app } = this;
    const res = await app.mysql.select("article");
    console.log(res);
  }

前端开发

1、脚手架 @vue/cli

https://cli.vuejs.org/zh/guide/installation.html

$ cnpm install -g @vue/cli
$ vue -V
3.12.0
$ vue --help
$ vue create client
$ cd client
$ npm run serve

http://localhost:8080/

2、前端组件库 vant

https://youzan.github.io/vant/#/zh-CN/quickstart

$ npm i vant -S
$ npm i babel-plugin-import -D

在 .babelrc 中添加配置

{
  "plugins": [
    ["import", {
      "libraryName": "vant",
      "libraryDirectory": "es",
      "style": true
    }]
  ]
}

App.vue引入vant组件

<template>
  <div id="app">
    <van-button type="primary">按钮组件</van-button>
  </div>
</template>
<script>
import { Button } from 'vant';
export default {
  name: 'app',
  components: {
    [Button.name]: Button
  }
}
</script>

3、路由vue-router

cnpm i vue-router --save

4、处理时间

cnpm i moment --save
// 后端保存之前
const moment = require('moment');
const create_time = moment().format('YYYY-MM-DD HH:mm:ss');
// 2019-10-13 22:29:23
//前端展示之前
import momemt from 'moment';
this.list = res.data.map(item=>{
  if(item.create_time){
    item.create_time  = moment(item.create_time).format('YYYY-MM-DD HH:mm:ss');
  }
  return item;
});

5、客户端跨域请求

vue.config.js

module.exports = {
    // 处理跨域请求
    devServer: {
        proxy: {
            '/article': {
                target: "http://127.0.0.1:7001/",
                ws: true, // 允许websockt服务
                changeOrigin: true // 开启虚拟服务器,请求代理服务器
            }
        }
    }
}


相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
JavaScript 前端开发
node.js 快速入门
node.js 快速入门
29 0
|
2月前
|
Web App开发 JavaScript 前端开发
【Node.js】大前端技能最通俗易懂的讲解 快速入门必看
【Node.js】大前端技能最通俗易懂的讲解 快速入门必看
32 0
|
8月前
|
JavaScript
【JS】快速入门DOM
【JS】快速入门DOM
42 0
|
5月前
|
存储 设计模式 JavaScript
【Vue.js】快速入门与工作生命周期的使用
【Vue.js】快速入门与工作生命周期的使用
45 0
|
6月前
|
JavaScript 前端开发 安全
JavaScript--快速入门
JavaScript--快速入门
30 0
|
8月前
|
JavaScript
Vue.js快速入门(2)
Vue.js快速入门(2)
46 0
|
8月前
|
Web App开发 JavaScript 前端开发
Vue.js快速入门(1)
Vue.js快速入门(1)
47 0
|
9月前
|
前端开发 JavaScript
五分钟快速入门:JavaScript正则表达式
引言:是不是很苦恼,每次学习正则表达式都感觉头大如斗、晦涩难懂?别担心!本文将以简洁易懂的方式,带你轻松掌握 JavaScript 正则表达式。让你告别繁琐的字符串处理,从容应对各种文本操作挑战。
73 0
|
前端开发 JavaScript
JS之MockJS快速入门(超详细)
JS之MockJS快速入门(超详细)
743 0
JS之MockJS快速入门(超详细)