Koa2+mysql 搭建用户信息注册和登录接口服务

koa2 官网

https://koa.bootcss.com/

什么是koa?

Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。 通过利用 async 函数,Koa 帮你丢弃回调函数,并有力地增强错误处理。 Koa 并没有捆绑任何中间件, 而是提供了一套优雅的方法,帮助您快速而愉快地编写服务端应用程序。

初始化koa项目

npm init

安装koa

npm i koa

新建一个app.js

// 导入koa
const Koa = require('koa')
// 创建一个koa对象
const app = new Koa()
//监听端口
const port = 3000
app.listen(port);
console.log(`启动成功,服务端口为:${port}`)

运行app.js

node app.js
// console.log(`启动成功,服务端口为:${port}`)
图片.png
图片.png

添加启动脚本命令

//package.json
 "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "dev":"node app.js"
  }

可以运行 npm run dev启动我们的服务。

使用 www 启动服务

在根目录建立 bin文件夹,然后新建 www文件

// bin/www
var app = require('../app');
var http = require('http');

var server = http.createServer(app);
//服务监听端口
server.listen('3001');

配置www启动脚本

//package.json
 "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "dev":"node bin/www"
  }

然后 npm run dev就能启动了。

加点服务的返回内容

// 导入koa
const Koa = require('koa')
// 创建一个koa对象
const app = new Koa()

//返回的内容
app.use(async ctx => {
    ctx.body = 'Hello World';
});


//监听端口
const port = 3000
app.listen(port);
console.log(`启动成功,服务端口为:${port}`)
图片.png

安装中间件 koa-bodyparser

这个中间件可以将post请求的参数转为json格式返回;

npm install --save koa-bodyparser

bodyparser 使用

// 导入koa
const Koa = require('koa')

const bodyParser = require('koa-bodyparser');
// 创建一个koa对象
const app = new Koa()

app.use(bodyParser());
// request.method可以获取请求方法。
// get,post或者其他类型(request对象被封在ctx内,所以也可以ctx.method获取)
app.use(async (ctx) => {
    if (ctx.url === '/' && ctx.method === 'POST') {
        ctx.body = ctx.request.body
    } else {
        // 其他请求显示404
        ctx.body = '<h1>404!</h1>'
    }
})


//监听端口
const port = 3000
app.listen(port);
console.log(`启动成功,服务端口为:${port}`)

开始写接口之前,我们安装一下路由 Koa-router
Koa-router是 koa 的一个路由中间件,它可以将请求的URL和方法(如:GETPOSTPUTDELETE 等) 匹配到对应的响应程序或页面。

npm install koa-router --save

使用koa-router

const Router = require('koa-router'); // 引入koa-router
const router = new Router(); // 创建路由,支持传递参数


// 指定一个url匹配
router.get('/', async (ctx) => {
    ctx.type = 'html';
    ctx.body = '<h1>hello world!</h1>';
})

// 调用router.routes()来组装匹配好的路由,返回一个合并好的中间件
// 调用router.allowedMethods()获得一个中间件,当发送了不符合的请求时,会返回 `405 Method Not Allowed` 或 `501 Not Implemented`
app.use(router.routes());
app.use(router.allowedMethods({ 
    // throw: true, // 抛出错误,代替设置响应头状态
    // notImplemented: () => '不支持当前请求所需要的功能',
    // methodNotAllowed: () => '不支持的请求方式'
}));

koa-router 不同请求方式

Koa-router 请求方式: get 、 put 、 post 、 patch 、 delete 、 del ,而使用方法就是 router.方式() ,比如 router.get() 和 router.post() 。而 router.all() 会匹配所有的请求方法。

// 指定一个url匹配
router.get('/test', async (ctx) => {
    ctx.type = 'html';
    ctx.body = '<h1>hello world!</h1>';
})
router.get("/user", async (ctx) => {
    ctx.body = '叫我詹躲躲';
})
图片.png

新建router/index.js 路由文件夹

// router/index.js
const Router = require('koa-router')
const router = new Router()

//接口函数
class UserController {
    // 新增一条数据
    async getUserName(ctx) {
        ctx.body = {
            code: 200,
            message: '叫我詹躲躲',
            type: 'warning'
        }
    }
}

//实例
const userController = new UserController()

// 测试
router.get('/test', userController.getUserName)

module.exports = router

测试一下


图片.png

安装中间件 koa2-cors

cors跨域资源共享是一种机制,用来允许不同源服务器上的指定资源可以被特定的Web应用访问。

cors 安装

npm install koa-cors --save

cors 使用

//app.js
const Cors = require('koa2-cors')
app.use(Cors())

koa连接数据库(mysql)

需要安装sql依赖;

npm install mysql --save

SQL配置

新建一个 sql文件夹,主要用于存放sql的各种操作;

sql/config.js

const mysqlConfig = {
    user: "Koa", //账号
    password: "Koa", //密码
    database: "Koa", //数据库
    host: "122.112.172.87", //服务器地址
    port: 3306, //数据库端口
    timezone: '08:00'
};
module.exports = mysqlConfig;

koa封装sql数据库query函数

//sql/query.js
const mysql = require("mysql");
const config = require("./config");

//创建连接池
const pool = mysql.createPool(config);
const query = (sql, val) => {
    return new Promise((resolve, reject) => {
        pool.getConnection(function (err, connection) {
            if (err) {
                reject(err);
            } else {
                connection.query(sql, val, (err, fields) => {
                    if (err) {
                        reject(err);
                    } else {
                        resolve(fields);
                    }
                    connection.release();
                });
            }
        });
    });
};

module.exports = { query };

新增接口 - 用户信息注册 和 登录

新建两个文件夹 controller 和 model
controller主要存放操作和数据处理的一些逻辑

// controller/userController.js
// 用户注册
const User = require('../model/userModel')

class UserController {
    // 用户注册
    async register(ctx) {
        let { name, tel, password } = ctx.request.body
        const names = await User.getUser(name) //用户名是否重复
        const tels = await User.getTel(tel) //手机号是否重复

        if (tels.length > 0) {
            ctx.body = { type: 'warning', message: '该手机号已注册' }
        } else {
            if (names.length > 0) {
                ctx.body = { type: 'error', message: '用户名已存在' }
            } else {
                await User.insert(name, tel, password)
                ctx.body = { type: 'success', code: 0, message: '注册成功' }
            }
        }
    }
    // 登录
    async login(ctx) {
        let tel = ctx.request.body.tel
        let password = ctx.request.body.password
        const res = (await User.getTel(tel))[0]
        if (res) {
            if (res.password == password) {
                ctx.body = {
                    code: 0,
                    data: {
                        name: res.name,
                        tel: res.tel
                    },
                    message: '登录成功',
                    type: 'success'
                }
            } else {
                ctx.body = { type: 'error', message: '用户名或密码不正确' }
            }
        } else {
            ctx.body = { type: 'error', message: '用户名不存在' }
        }
    }
}
module.exports = new UserController()

model中操作数据库的函数(包含数据库语句)

// model/userModel.js

const query = require('../sql/query')
class UserModel {
    //获取用户
    async getUser(name) {
        return await query(`SELECT * FROM user WHERE name = '${name}'`)
    }
    //获取用户手机号
    async getTel(tel) {
        return await query(`SELECT * FROM user WHERE tel = '${tel}'`)
    }
    //用户注册
    async insert(name, tel, password) {
        return await query(`INSERT INTO user(name, tel, password) VALUES('${name}', '${tel}', '${password}')`)
    }
}
module.exports = new UserModel()

在router路由文件里面注册

//router/index.js

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

//用户
const UserController = require('../controller/UserController')

//用户注册
router.post('/register', UserController.register)
//用户信息登录
router.post('/login', UserController.login)

module.exports = router

接口调用

使用post请求就可以调用 /register 和 /login两个接口啦;当然也可以再封装其他更多的接口。

结尾

到此 用户的注册和登录接口就写完了。后续继续其他功能添加。有兴趣的可以查看源码 源码地址,一起学习,一起加油。我是叫我詹躲躲,很高兴认识你。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容