Koa2是目前Node.js世界最火的web框架,不管從性能,仍是流程控制上,koa 2和它的後宮(中間件)都是很是好的解決方案。本文主要koa 2的文檔解讀和runkoa介紹,讓你們對koa 2有一個更簡單直接的理解前端
搭建一個項目首先要要清楚地創建起一個文件系統目錄,這樣纔會清晰明瞭地安放項目的文件路徑,對項目的結構也有所明確。node
項目暫時的文件目錄以下:es6
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
文件目錄解析:web
app用於存放前端的JavaScript視圖模板mongodb
controllers用於存放後臺的控制器數據庫
modules是數據的原型npm
public用於存放靜態資源json
routers用於存放路由系統api
app.js是後臺的入口文件安全
config.js是配置文件
start.js用於es6和es7babel轉換
(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了^_^
咱們以前已經說過了,app.js是入口文件,一塊兒來看看吧!
import Koa from 'koa'//引入koa2 const app = new Koa(); app.listen(3000); console.log('app started at port 3000...');
這樣Koa的服務運行就開啓了!但是這樣遠遠是沒法爲web提供api的,咱們首先須要的是路由系統。
以前已經安裝了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>`; }
當咱們搭建好各類路由響應後就要配置數據庫了。
要用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方法,數據模型,關係存儲以及安全權限驗證了,接下來的開發過程當中會進一步補充這一系列的總結。