Node.js 實現RestFul API

前端開發(fā)人員,有時候需要做一些接口調試,koa2+mysql2的組合方式恰好能夠快速實現,作為學習筆記記錄下

環(huán)境準備

首先需要node.js和mysql,mac可使用homebrew快速安裝

搭建koa2項目

可以命令一步一步搭建

npm init

這里我們使用koa-generator生成項目,類似vue-cli

### 全局安裝 koa-generator
npm install koa-generator -g

### 創(chuàng)建項目,demo為項目名
koa2 demo

### 進入項目目錄
cd demo 

### 安裝項目依賴
npm install 

### 啟動項目 可任選一種
npm start   (每次代碼修改都需要重啟項目)
npm run dev (代碼發(fā)生改變時自動重啟項目)

生成的項目目錄結構如下,可以看到package.json中已給我們添加了很多插件依賴


啟動項目完成后,在瀏覽器輸入:localhost:3000,瀏覽器運行結果,搭建的koa2項目就已完成

實現API

安裝依賴

這里選擇Node的ORM框架Sequelize來操作數據庫。這樣,我們讀寫的都是JavaScript對象,Sequelize幫我們把對象變成數據庫中的行,同時安裝mysql2。

npm install sequelize mysql2 --save

數據庫連接

在根目錄下新建config目錄->新建db.js文件

const Sequelize = require('sequelize');
/**
 * 數據庫名稱, 賬號,密碼
 */
const sequelize = new Sequelize('zf','root','123456',{
    host:'localhost',
    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'  //東八時區(qū)
});
 
module.exports = {
    sequelize
};

定義數據模型

在根目錄下新建models目錄->新建pet.js文件

const moment = require('moment');
module.exports = function(sequelize,DataTypes){
    return sequelize.define('pet',
        {
            id:{
                type: DataTypes.INTEGER(11),
                primaryKey: true,
                allowNull: false,
                autoIncrement: true
            },
            name:{
                type: DataTypes.STRING(100),
                allowNull: false,
                field: 'name'
            },
            gender:{
                type: DataTypes.TINYINT(0),
                allowNull: false,
                field: 'gender'
            },
            birth:{
                type: DataTypes.DATE,
                allowNull: false,
                field: 'birth',
                set: function(val) {
                    this.setDataValue('birth', new Date(val*1000));
                },
                get() {
                    return moment(this.getDataValue('birth')).format('YYYY-MM-DD HH:mm:ss');
                }
            },
            isDeleted: {
              type: DataTypes.BOOLEAN,
              allowNull: true,
              defaultValue: false
            },
            createdAt: {
                type: DataTypes.DATE,
                allowNull: true,
                get() {
                    return moment(this.getDataValue('createdAt')).format('YYYY-MM-DD HH:mm:ss');
                }
            },
            updatedAt: {
                type: DataTypes.DATE,
                allowNull: true,
                get() {
                    return moment(this.getDataValue('updatedAt')).format('YYYY-MM-DD HH:mm:ss');
                }
            },
            version: {
                type: DataTypes.BIGINT,
                allowNull: true,
            }
        },
        {   
            /**
             * 如果為true,則表示名稱和model相同,即user
             * 如果為fasle,mysql創(chuàng)建的表名稱會是復數,即users
             * 如果指定的表名稱本身就是復數,則形式不變
             */
            freezeTableName: true,

            //關閉Sequelize的自動添加timestamp的功能
            timestamps: false
        }
    );
}

模型操作

在根目錄下新建modules目錄->新建pet.js文件

//引入db配置
const db = require('../config/db')

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

//引入數據表模型
const pet = Sequelize.import('../models/pet')
//自動創(chuàng)建表
pet.sync({ force: false }); 

//數據庫操作類
class petModel {

    static async createPet(data) {
        var now = Date.now();
        return await pet.create({
            name: data.name,
            gender: data.gender,
            birth: data.birth,
            createdAt: now,
            updatedAt: now,
            version: 0
        })
    }

    static async getPets() {
        return await pet.findAll({
            where: {
            }
        })
    }

    static async getPet(id) {
        console.log(id)
        return await pet.findOne({
            where: {
                id
            }
        })
    }
}

module.exports = petModel;

邏輯操作

在根目錄下新建controllers目錄->新建pet.js文件

const petModel = require("../modules/pet");
 
class petController {
    /**
     * 創(chuàng)建寵物信息
     * @param ctx
     * @returns {Promise.<void>}
     */
    static async create(ctx){
        //接收客服端
        let req = ctx.request.body;
        if(req.name && req.gender && req.birth ){
            try{
                //創(chuàng)建寵物信息模型
                const ret = await petModel.createPet(req);
                const data = await petModel.getPet(ret.id);
 
                ctx.response.status = 200;
                ctx.body = {
                    code: 200,
                    msg: '創(chuàng)建寵物信息成功',
                    data
                }
            }catch(err){
                console.log(err)
                ctx.response.status = 412;
                ctx.body = {
                    code: 412,
                    msg: '創(chuàng)建寵物信息失敗',
                    data: err
                }
            }
        }else {
            ctx.response.status = 416;
            ctx.body = {
                code: 200,
                msg: '參數不齊全'
            }
        }
    }
 
    /**
     * 獲取寵物詳情
     * @param ctx
     * @returns {Promise.<void>}
     */
    static async detail(ctx){
        let id = ctx.request.query.id;
        if(id){
            try{
                let data = await petModel.getPet(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 = petController;

路由設置

在routes目錄下新建pet.js文件

const router = require('koa-router')()

const PetController = require('../controllers/pet');
 
router.prefix('/pet')

router.post('/create',PetController.create);

router.get('/get',PetController.detail)
 
module.exports = router

然后再App.js中添加以下內容

const pet = require('./routes/pet')
app.use(pet.routes(), pet.allowedMethods())

最后的項目目錄結構如下:

啟動項目服務

npm run dev

這時候會發(fā)現報如下錯誤:

到這里,看gitHub上的提示是新版本不支持這種引入方式,請參考最新的demo

這里把sequelize的版本降低下來引入

npm install sequelize@^5.x.x --save

再 npm run dev,可以看到能正常運行起來了

測試API

用postman調用剛剛新建的接口

查看數據庫

簡單的接口實現已完成

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容