博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
EDU_BOOK 开发总结
阅读量:6955 次
发布时间:2019-06-27

本文共 5683 字,大约阅读时间需要 18 分钟。

EDU_BOOK 开发总结

KOA2 + Mongodb 整体框架搭建API

Koa2是目前Node.js世界最火的web框架,无论从性能,还是流程控制上,koa 2和它的后宫(中间件)都是非常好的解决方案。本文主要koa 2的文档解读和runkoa介绍,让大家对koa 2有一个更简单直接的理解

1.项目目录生成

搭建一个项目首先要要清楚地建立起一个文件系统目录,这样才会清晰明了地安放项目的文件路径,对项目的结构也有所明确。

项目暂时的文件目录如下:

EDU_Book_Background/├── app├── controllers/│     ├── loginController.js│        └── registController.js├── modules/│        └── user.js├── node_mudules├── public├── routes/│        ├──home.js│        ├──index.js│        ├──login.js│        └──regist.js├── app.js├── config.js├── package.json├── start.js└── README.md

文件目录解析:

  1. app用于存放前端的JavaScript视图模板

  2. controllers用于存放后台的控制器

  3. modules是数据的原型

  4. public用于存放静态资源

  5. routers用于存放路由系统

  6. app.js是后台的入口文件

  7. config.js是配置文件

  8. start.js用于es6和es7babel转换

2.Koa2的搭建

(1) 首先先安装koa2的npm包:

npm --save-dev install koa@next

(2) 接着安装koa的路由系统npm包:

npm --save-dev install koa-router@next

(3) 安装babel的npm包进行js语言的转换

npm --save-dev install babel-core babel-polyfill babel-preset-es2015-node6 babel-preset-stage-3

这时候我们已经安装好koa2框架的基本使用需求依赖包了。但是我们要怎么在node环境中运行es6和es7的语法呢?所以我们需要写一个js脚本来进行对app.js的转换操作,那就是

server.js文件:

require('babel-core/register')({    presets: ['stage-3','es2015-node6']});require("babel-polyfill");require('./app.js');//确定入口文件是app.js

然后每次要启动或者调试程序就是在cmd下运行:

node start.js

这样我们就可以通过koa2来编写需要的后台服务api了^_^

3.Koa2的服务编写

我们之前已经说过了,app.js是入口文件,一起来看看吧!

import Koa from 'koa'//引入koa2const app = new Koa();app.listen(3000);console.log('app started at port 3000...');

这样Koa的服务运行就开启了!可是这样远远是无法为web提供api的,我们首先需要的是路由系统。

4.Koa2的路由系统搭建

之前已经安装了koa-router支持koa2的路由系统npm包

于是app.js就变为:

import Koa from 'koa'import bodyParser from 'koa-bodyparser' //用于解析request中body的数据import session from 'koa-session' //用于session会话服务import convert from 'koa-convert' //koa2使用koa-session需要先进行convertimport mongoose from 'mongoose' //连接mongodb使用import config from './config' //程序的配置文件import router from './routes/index' //引入路由系统文件mongoose.connect(`mongodb://${config.mongodb.host}:${config.mongodb.port}/${config.mongodb.dbname}`); //从配置文件中加载数据连接数据库const app = new Koa();app.keys = [config.appKey];app.use(convert(session(app)));// parse request body:app.use(bodyParser());// add router middleware:app.use(router.routes()).use(router.allowedMethods());app.listen(3000);console.log('app started at port 3000...');

接下来看主要部分,路由系统

(1) 主路由文件index.js:

//分多个文件来对路由进行处理import Router from 'koa-router'import homeRouter from './home'import loginRouter from './login'import registRouter from './regist'const router = new Router();//登录响应路由router.use('/login',loginRouter.routes(),loginRouter.allowedMethods());//注册响应路由router.use('/',homeRouter.routes(),homeRouter.allowedMethods());//主页响应路由router.use('/regist',registRouter.routes(),registRouter.allowedMethods());export default router;

(2)举例登录路由文件:

login.js:

import Router from 'koa-router'import loginController from '../controllers/loginController'const router = new Router();router.post('/',loginController.loginPost); //对post方法的/login进行处理,调用登录管理控制器router.get('/',loginController.loginGet); //对get方法的/login进行处理export default router;

控制器处理路由:

loginController.js

import UserModel from '../models/user' //加载数据原型import { MD5, SHA256 } from 'crypto-js'; //引入加密方式exports.loginPost = async (ctx, next) => {    var req = ctx.request,        name = req.body.name,        password = SHA256(req.body.password),        email = req.body.email;    var result = await UserModel.findOne({        name: name,        password: password.toString(),        email: email    });    if (result && result._id) {        console.log('登录成功!!!');        ctx.set('Access-Control-Allow-Origin', '*');        ctx.response.status = 200;        ctx.response.type = 'application/json';        ctx.response.body = { name: name, password: password, email: email };    } else {        ctx.throw(400, 'some information wrong!');        console.log('登录信息不匹配!');    }}exports.loginGet = async (ctx, next) => {    ctx.response.status = 200;    ctx.response.body = `

Login

Name:

Password:

Email:

`;}

当我们搭建好各种路由响应后就要配置数据库了。

5.Mongoose数据库搭建

要用mongoose链接并搭建数据库得先建立一个数据原型:

user.js:

import mongoose from 'mongoose'var Schema = mongoose.Schema;const UserSchema = new Schema({  name: { type: String, required: true},  password: { type: String, required: true },  email: { type: String, required: true ,unique: true},  createdTime: { type: Date, default: Date.now() }});var User = mongoose.model('User', UserSchema);module.exports = User;

这样当我们需要写入或查询数据时就先引入数据原型,然后创建数据原型的新对象,进行匹配后如果正确就可以保存到数据库中:

var user = null,result = null,req = ctx.request,  name = req.body.name,  password = SHA256(req.body.password),  email = req.body.email;  user = new UserModel({    name: name,    password: password,    email: email,  });  result = await user.save().catch(e => e); //使用await进行异步操作保存数据到数据库  if(result && result._id) {    console.log(result._id);    console.log('success');    ctx.response.redirect('/login');  } else {    console.log("邮箱或用户名已经被注册过了!!!");  }

查找数据:

var req = ctx.request,        name = req.body.name,        password = SHA256(req.body.password),        email = req.body.email;    var result = await UserModel.findOne({        name: name,        password: password.toString(),        email: email    }); //使用await进行异步操作查询数据库中的数据    if (result && result._id) {        console.log('登录成功!!!');        ctx.set('Access-Control-Allow-Origin', '*');        ctx.response.status = 200;        ctx.response.type = 'application/json';        ctx.response.body = { name: name, password: password, email: email };    } else {        ctx.throw(400, 'some information wrong!');        console.log('登录信息不匹配!');    }

这样一来我们的服务器的大致框架就搭建好了,接下来就需要编写各种api方法,数据模型,关系存储以及安全权限验证了,接下来的开发过程中会进一步补充这一系列的总结。

转载地址:http://jftil.baihongyu.com/

你可能感兴趣的文章
Studio 3T:MongoDB SQL探究
查看>>
Java SE 12扩展Switch语句/表达式完整指南
查看>>
MySQL曝设计缺陷,多家公司被窃取文件
查看>>
CRI Shimv2:一种 Kubernetes 集成容器运行时的新思路
查看>>
Checkly如何借助Terraform实现零宕机部署
查看>>
独家揭秘:微博深度学习平台如何支撑4亿用户愉快吃瓜?
查看>>
Go 1.12发布:改进了运行时性能以及模块支持
查看>>
元数据驱动设计 —— 设计一套用于API数据检索的灵活引擎
查看>>
腾讯云携手朋迈推出“综合能源服务平台” 实现能源资源“智慧化”运营
查看>>
eBay宣布发布全新的购买和销售APIs
查看>>
微服务接口限流的设计与思考(附GitHub框架源码)
查看>>
Underscore 整体架构浅析
查看>>
SegmentFault 技术周刊 Vol.12 - Web 安全指南(上)
查看>>
HTML5中的表单
查看>>
vue初探-简易留言板
查看>>
完美解决safari、微信浏览器下拉回弹效果。
查看>>
我在那日界线上奔跑之JS---链表
查看>>
Ueditor 1.4.3.3 PHP图片上传路径修改
查看>>
matalb学习3-各种求解
查看>>
Hyper-V创建虚拟机
查看>>