Node.js 实现RestFul API

2020-09-17  本文已影响0人  lncircle

前端开发人员,有时候需要做一些接口调试,koa2+mysql2的组合方式恰好能够快速实现,作为学习笔记记录下

环境准备

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

搭建koa2项目

可以命令一步一步搭建

npm init

这里我们使用koa-generator生成项目,类似vue-cli

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

### 创建项目,demo为项目名
koa2 demo

### 进入项目目录
cd demo 

### 安装项目依赖
npm install 

### 启动项目 可任选一种
npm start   (每次代码修改都需要重启项目)
npm run dev (代码发生改变时自动重启项目)

生成的项目目录结构如下,可以看到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'  //东八时区
});
 
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创建的表名称会是复数,即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')
//自动创建表
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 {
    /**
     * 创建宠物信息
     * @param ctx
     * @returns {Promise.<void>}
     */
    static async create(ctx){
        //接收客服端
        let req = ctx.request.body;
        if(req.name && req.gender && req.birth ){
            try{
                //创建宠物信息模型
                const ret = await petModel.createPet(req);
                const data = await petModel.getPet(ret.id);
 
                ctx.response.status = 200;
                ctx.body = {
                    code: 200,
                    msg: '创建宠物信息成功',
                    data
                }
            }catch(err){
                console.log(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.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

这时候会发现报如下错误:

到这里,看gitHub上的提示是新版本不支持这种引入方式,请参考最新的demo

这里把sequelize的版本降低下来引入

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

再 npm run dev,可以看到能正常运行起来了

测试API

用postman调用刚刚新建的接口

查看数据库

简单的接口实现已完成

上一篇下一篇

猜你喜欢

热点阅读