用koa写简单的登录、注册接口
1. 什么是koa
Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。 通过利用 async 函数,Koa 帮你丢弃回调函数,并有力地增强错误处理。 Koa 并没有捆绑任何中间件, 而是提供了一套优雅的方法,帮助您快速而愉快地编写服务端应用程序。
具体可查看官网:Koa (koajs) -- 基于 Node.js 平台的下一代 web 开发框架 | Koajs 中文文档 (bootcss.com)
2.搭建一个基础koa服务 nodemon的简介:www.jianshu.com/p/f60e14db0…
npm init -y
npm install koa koa-router -S
npm install nodemon -D
// nodemon是一种工具,可以自动检测到目录中的文件更改时通过重新启动应用程序来调试基于node.js的应用 * 程序。
创建app.js
const Koa = require('koa');
const Router = require('koa-router');
//koa实例化
const app = new Koa();
const router = new Router();
router.get('/home',async ctx=>{
ctx.body="hello World111";
})
app.use(router.routes()).use(router.allowedMethods());
app.listen(3000,()=>{
console.log('服务启动了')
})
package.json需要添加一条nodemon的命令
"scripts": {
"server":"nodemon app.js"
}
基础koa服务的目录结构
3. 拆分路由模块
/routes/user.js app.js
const Koa = require('koa');
const Router = require('koa-router');
const user = require('./routes/user.js')
//koa实例化
const app = new Koa();
const router = new Router();
// 总路由添加前缀/api,总地址变为http://localhost:3000/api
router.prefix('/api')
router.get('/',async ctx=>{
ctx.body="hello World111";
})
// 子路由添加前缀/users,最后访问地址变为http://localhost:3000/api/users/user
router.use('/users',user.routes());
app.use(router.routes()).use(router.allowedMethods());
app.listen(3000,()=>{
console.log('服务启动了')
})
user.js
const router = require('koa-router')();
router.get('/user', (ctx) => {
ctx.body = {name:'tanwei'};
})
router.get('/userlist', (ctx) => {
ctx.body = [{name:'tanwei'},{name:'weiwei'}]
})
module.exports = router;
4. 拆分controllers
/controllers/user.js
class Users {
async getUser(ctx){
ctx.body = {name:'tanwei'};
}
async getUserlist(ctx){
ctx.body = [{name:'tanwei'},{name:'weiwei'}];
}
}
module.exports = new Users();
/routes/user.js
const router = require('koa-router')();
const { getUser,getUserlist } = require('../controllers/user.js')
router.get('/user', (ctx) => {
ctx.body = {name:'tanwei'};
})
router.get('/userlist', (ctx) => {
ctx.body = [{name:'tanwei'},{name:'weiwei'}]
})
module.exports = router;
5、post请求如何如何处理
npm i koa-body -S
const koaBody = require('koa-body');
app.use(koaBody())
// 通过ctx.request.body获取post参数
6、koa连接mongodb数据库
安装插件: npm i mongoose --save
app.js
const mongoose = require('mongoose'); // 连接数据库
mongoose.connect(connectionStr,(err)=>{
if(err) {console.log('mongonDB连接失败了'); return};
console.log('mongonDB连接成功了'); })
/config/keys.js
module.exports={
connectionStr:'mongodb://localhost:27017/?readPreference=primary&appname=MongoDB%20Compass&directConnection=true&ssl=false'
}
生成一个User模板,这个模板就是你定义的字段和字段的数据类型 首先分析用户登录注册包含的属性 用Schema生成model /models/user.js
const mongoose = require('mongoose');
const { Schema, model } = mongoose;
const userSchema = new Schema({
username: { type: String, required: true },
password: { type: String, required: true }
})
module.exports = model('Product', userSchema,'product')
/routes/user.js
const Router = require('koa-router');
const router = new Router();
const { reg,login } = require('../controllers/product')
/**
* @route GET api/users/register
* @desc 测试接口地址
* @access 接口是公开的
*/
router.post('/register',reg);
router.post('/login',login);
module.exports = router;
/controllers/user.js
const User = require('../models/user');
const keys = require('../config/keys')
class Products {
async reg(ctx) {
// console.log(ctx.request.body);
ctx.body = ctx.request.body;
//存储到数据库
const findResult = await User.find({ username: ctx.request.body.username });
// findResult数组
if (findResult.length > 0) {
ctx.body = { msg: '邮箱已经存在!!!' }
} else {
//没查到
const newUser = new User({
username: ctx.request.body.username,
password: ctx.request.body.password
})
//存储到数据库
await newUser.save().then(res => {
ctx.body = newUser
}).catch(err => {
console.log(err)
})
}
}
async login(ctx) {
const findResult = await User.find({ username: ctx.request.body.username });
if (findResult.length === 0) {
ctx.status = 404
ctx.body = { email: '用户不存在!!!' }
} else {
const user = findResult[0];
const password = ctx.request.body.password;
// 返回true和false
const result = password == user.password;
if (result) {
ctx.status = 200;
ctx.body = { msg: '登录成功!!!'};
} else {
ctx.status = 400;
ctx.body = { msg: '登录失败!!!' };
}
}
}
async delUser(ctx){
}
}
module.exports = new Products();