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
文件目录解析:
app用于存放前端的JavaScript视图模板
controllers用于存放后台的控制器
modules是数据的原型
public用于存放静态资源
routers用于存放路由系统
app.js是后台的入口文件
config.js是配置文件
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'//引入koa2
const 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需要先进行convert
import 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 = `<h1>Login</h1>
<form action="/login" method="post">
<p>Name: <input name="name" type="text"></p>
<p>Password: <input name="password" type="password"></p>
<p>Email: <input name="email" type="text"></p>
<p><input type="submit" value="Submit"></p>
</form>`;
}
当我们搭建好各种路由响应后就要配置数据库了。
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方法,数据模型,关系存储以及安全权限验证了,接下来的开发过程中会进一步补充这一系列的总结。