动态

详情 返回 返回

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

添加啓動腳本命令

//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兩個接口啦;當然也可以再封裝其他更多的接口。

結尾

到此 用户的註冊和登錄接口就寫完了。後續繼續其他功能添加。有興趣的可以查看源碼 源碼地址,一起學習,一起加油。我是叫我詹躲躲,很高興認識你。

user avatar smalike 头像 vleedesigntheory 头像 inslog 头像 anchen_5c17815319fb5 头像 jiavan 头像 evenboy 头像 nqbefgvs 头像 tanggoahead 头像 yulong1992 头像 jmix 头像 zdyz 头像 ichu 头像
点赞 54 用户, 点赞了这篇动态!
点赞

Add a new 评论

Some HTML is okay.