美文网首页
Node.js 实现RestFul API

Node.js 实现RestFul API

作者: lncircle | 来源:发表于2020-09-17 19:13 被阅读0次

    前端开发人员,有时候需要做一些接口调试,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调用刚刚新建的接口

    查看数据库

    简单的接口实现已完成

    相关文章

      网友评论

          本文标题:Node.js 实现RestFul API

          本文链接:https://www.haomeiwen.com/subject/nzlryktx.html