eggjs快速入門+數據庫連接


Koa

Koa是一個新的web框架,由Express幕后的原班人馬打造,致力於成為web應用和API開發領域中的一個更小、更富有表現力、更健壯的基石。

Koa相對於Express有幾個顯著的特點。

  • Koa中間件選擇了洋蔥模型
  • Koa除了Express的Request和Response兩個對象外,增加了Context對象
  • 將捕獲異常中間件放在其他中間件之間,就可以捕獲到它們的異常了。

中間件洋蔥模型

中間件洋蔥圖

中間件執行順序:

中間件執行順序

每個中間件就像是洋蔥的一層,所有的請求經過一個中間件都會執行兩次,這樣可以非常方便的后置處理邏輯。

Egg.js

Egg.js為企業級框架和應用而生,我們希望由Egg孕育出更多上層框架,幫助開發團隊和開發人員降低開發和維護成本。

Egg不直接提供功能,只是集成各種功能插件。簡單來說,就一個詞,那就是輕量化

Egg是基於Koa開發的,選擇其作為基礎框架,在它的模型基礎上,進行了一些增強。

  • 擴展

在基於Egg的框架或者應用中,我們可以定義app/extend/{application, context, request, response}.js來擴展Koa中對應的四個對象的原型,這樣我們就可以快速的增加更多的輔助方法。

  • 插件

一個插件可以包含extendmiddlewareconfigextend擴展基礎對象的上下文,提供各種工具類、屬性。mdidleware增加一個或多個中間件,提供請求的前置、后置處理邏輯。config配置各個環境下插件自身的默認配置項。

第一個項目

使用腳手架可以快速生成項目。

npm init egg --type=simple

egg項目文件結構規范。

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
  • app/router.js,用於配置URL路由規則。
  • app/controller/**,用於解析用戶的輸入,處理后返回相應的結果。
  • app/service/**,用於編寫業務邏輯層,可選。
  • app/middleware/**,用於編寫中間件。
  • app/public/**,用於放置靜態資源。
  • app/extend/**,用於擴展框架。
  • config/config.{env}.js,用於編寫配置文件。
  • config/plugin.js用於配置需要加載的插件。
  • test/**,用於單元測試。
  • app.jsagent.js,用於自定義啟動時的初始化工作,可選。#

初始化項目后,直接使用npm run dev啟動項目,在localhost:7001就可以看到。

hi, egg

連接數據庫

使用sequelize連接數據庫,首先安裝egg-sequelizemysql2

npm install --save egg-sequelize mysql2

config/plugin.js中啟用eggsequelize插件。

// config/plugin.js
exports.sequelize = {
  enable: true,
  package: 'egg-sequelize',
};

config/config.default.js中添加sequelize配置。

// config/config.default.js
config.sequelize = {
  dialect: 'mysql',
  host: '127.0.0.1',
  port: 3306,
  database: 'egg-sequelize-doc-default',
  username: 'root',
  password: 'w123456',
}

在數據庫中創建表並插入數據。

數據庫

app/model/user.js中編寫代碼實現業務邏輯。

// app/model/user.js
'use strict';

module.exports = app => {
  const {
    STRING,
    INTEGER,
  } = app.Sequelize;

  const User = app.model.define('user', {
    id: {
      type: INTEGER,
      primaryKey: true,
      autoIncrement: true,
    },
    name: STRING(50),
    sex: STRING(4),
    pass: STRING(32),
  }, {
    freezeTableName: true,
    timestamps: false,
  });

  return User;
};

這個Model就可以在Controller和Service中通過app.model.User訪問,編寫Controller調用這個Model。

// app/controller/user.js
'use strict';

const Controller = require('egg').Controller;

class UserController extends Controller {
  async index() {
    const _ctx = this.ctx;
    const user = await _ctx.model.User.findAll();
    _ctx.body = user;
  }
}

module.exports = UserController;

將controller掛載到路由上。

// app/router.js
module.exports = app => {
  const { router, controller } = app;
  router.resources('users', '/users', controller.users);
};

使用npm run dev命令啟動項目。在localhost:7001/user看到數據庫中的數據。

訪問成功

訪問成功!

個人微信公眾號


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM