基於Koa2框架的項目搭建及實戰開發


Koa是基於 Node.js 平台的下一代 web 開發框架,由express原班人馬打造,致力於成為一個更小、更富有表現力、更健壯的 Web 框架。使用 koa 編寫 web 應用,通過組合不同的 generator,可以免除重復繁瑣的回調函數嵌套,並極大地提升錯誤處理的效率。koa 不在內核方法中綁定任何中間件,它僅僅提供了一個輕量優雅的函數庫,使得編寫 Web 應用變得得心應手。

此文是簡單介紹使用kos2進行項目的基本搭建以及api的簡單開發

搭建環境

1.因為此框架是基於node.js的,安裝node是必須的進行的第一步,這里不再詳細介紹

2.安裝koa(我們使用淘寶鏡像進行安裝)

npm install koa --save

3.安裝koa2項目生成器並創建項目

cnpm install koa-generator -g
koa2 myPro
cd myPro
cnpm install
koa2 myPro用來生成項目的基本的項目架構

4.啟動項目服務

npm start 

訪問 http://localhost:3000/

這是項目搭建成功的初始頁面

搭建項目

接下來進行實戰項目的基本搭建

1.安裝sequelize(Sequelize是一個基於promise的nodejs ORM,目前支持Postgres、mysql、SQLite和Microsoft SQL Server。它具有強大的事務支持,關聯關系,讀取和復制等功能。)

cnpm install sequelize --save

2.安裝mysql、mysql2

項目使用的是mysql的數據庫

cnpm install mysql mysql2 --save

3.配置Sequelize的數據庫鏈接

在項目的根目錄下創建一個config目錄,config目錄中創建db.js,該文件主要用來創建mysql的數據庫鏈接的。

/config/db.js

const Sequelize = require('sequelize');
const sequelize = new Sequelize('test','root','123456',{
    host:'182.61.15.43',
    dialect:'mysql',
    operatorsAliases:false,
    dialectOptions:{
        //字符集
        charset:'utf8mb4',
        collate:'utf8mb4_unicode_ci',
        supportBigNumbers: true,
        bigNumberStrings: true
    },
    pool:{
        max: 5,
        min: 0,
        acquire: 30000,
        idle: 10000
    },
    timezone: '+08:00'  //東八時區
});

module.exports = {
    sequelize
};

其中test為數據庫名稱,root為數據庫用戶名,123456為數據庫密碼,這是我自己搭建的服務器

4.創建schema、modules、controllers

schema:數據表模型實例
modules:實體模型
controllers:控制器

3個目錄下分別創建student.js(有點像thinkPhp5的框架目錄)

5.schema數據表模型
在schema目錄下新建一個student.js文件,該文件的主要作用就是建立與數據表的對應關系,也可以理解為代碼的建表。

schema/student.js

const moment = require("moment");
module.exports = function(sequelize,DataTypes){
    return sequelize.define('student',{
        id:{
            type: DataTypes.INTEGER,
            primaryKey: true,
            allowNull: true,
            autoIncrement: true
        },
        //學生姓名
        name:{
            type: DataTypes.STRING,
            allowNull: false,
            field: 'name'
        },
        //年齡
        age:{
            type: DataTypes.INTEGER,
            allowNull: false,
            field: 'age'
        },
        //性別
        gender:{
            type: DataTypes.STRING,
            allowNull: false,
            field:'gender'
        },
        //分數
        grade:{
            type: DataTypes.STRING,
            allowNull: false,
            field: 'grade'
        },
        // 創建時間
        createdAt:{
            type: DataTypes.DATE
        },
        // 更新時間
        updatedAt:{
            type: DataTypes.DATE
        }
    },{
        /**
         * 如果為true,則表示名稱和model相同,即user
         * 如果為fasle,mysql創建的表名稱會是復數,即users
         * 如果指定的表名稱本身就是復數,則形式不變
         */
        freezeTableName: true
    });
}

6.模型應用、使用
在項目中modules目錄下創建student.js文件,為學生信息表,該文件為文章的實例。

// 引入mysql的配置文件
const db = require('../config/db');

// 引入sequelize對象
const Sequelize = db.sequelize;

// 引入數據表模型
const student = Sequelize.import('../schema/student');
student.sync({force: false}); //自動創建表

class studentModel {
    /**
     * 創建學生表模型
     * @param data
     * @returns {Promise<*>}
     */
    static async createStudent(data){
        return await student.create({
            name: data.name, //姓名
            age: data.age,  //年齡
            gender: data.gender,  //性別
            grade: data.grade //分數
        });
    }

    /**
     * 查詢學生信息的詳情
     * @param id 學生信息ID
     * @returns {Promise<Model>}
     */
    static async getStudentDetail(id){
        return await student.findOne({
            where:{
                id
            }
        });
    }
}

module.exports = studentModel;

7controller 控制器
控制器的主要作用為功能的處理,項目中controller目錄下創建article.js,代碼如下:

const StudentModel = require("../modules/student");

class studentController {
    /**
     * 創建學生信息
     * @param ctx
     * @returns {Promise.<void>}
     */
    static async create(ctx){
        //接收客服端
        let req = ctx.request.body;
        if(req.name && req.age && req.gender && req.grade){
            try{
                //創建學生信息模型
                const ret = await StudentModel.createStudent(req);
                //使用剛剛創建的學生信息ID查詢學生信息詳情,且返回學生信息詳情信息
                const data = await StudentModel.getStudentDetail(ret.id);

                ctx.response.status = 200;
                ctx.body = {
                    code: 200,
                    msg: '創建學生信息成功',
                    data
                }
            }catch(err){
                ctx.response.status = 412;
                ctx.body = {
                    code: 412,
                    msg: '創建學生信息失敗',
                    data: err
                }
            }
        }else {
            ctx.response.status = 416;
            ctx.body = {
                code: 200,
                msg: '參數不齊全'
            }
        }
    }

    /**
     * 獲取文章詳情
     * @param ctx
     * @returns {Promise.<void>}
     */
    static async detail(ctx){
        let id = ctx.params.id;
        if(id){
            try{
                // 查詢學生信息詳情模型
                let data = await StudentModel.getStudentDetail(id);
                ctx.response.status = 200;
                ctx.body = {
                    code: 200,
                    msg: '查詢成功',
                    data
                }
            }catch(err){
                ctx.response.status = 412;
                ctx.body = {
                    code: 412,
                    msg: '查詢失敗',
                    data
                }
            }
        }else {
            ctx.response.status = 416;
            ctx.body = {
                code: 416,
                msg: '學生ID必須傳'
            }
        }
    }
}

module.exports = studentController;

8.路由

路由,也可以簡單理解為路徑,主要是作為請求的url,請求的路徑來處理一些請求,返回數據。一般情況下,基於node的項目,路由都是在一個叫做routes的目錄下面。

routes目錄下創建student.js,代碼如下:

const router = require('koa-router')()
// 學生
const StudentController = require('../controllers/student');

router.prefix('/student')
/**
 * 學生接口
 */
//創建學生
router.post('/student/create',StudentController.create);
//獲取學生詳情
router.get('/student/:id',StudentController.detail)

module.exports = router

然后在app.js添加如下內容

const student = require('./routes/student')
app.use(student.routes(), student.allowedMethods())
9.啟動項目服務

如果啟動過程中出現上圖的結果,說明服務啟動成功

接下來,就可以測試接口了。

10.解決跨域
跨域是web開發中不可避免的一個必須要解決的問題了。跨域問題,主要是要解決服務器端的通信問題。在node的開發中,只需要實現一個CORS標准就可以了。

cnpm install koa-cors --save

然后在根目錄下的app.js加入koa-cors的引用:

const cors = require('koa-cors')
app.use(cors()) //使用cors

然后重新啟動服務。

接下來使用postman進行接口的測試

接口返回成功

使用Navicat查看test數據庫下面的表,如圖

已經在test下創建了一張student新表,關於koa2的項目搭建先簡單介紹到這里吧,算是對所有知識的一個小總結。


免責聲明!

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



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