EDU_BOOK 開發總結

EDU_BOOK 開發總結

KOA2 + Mongodb 總體框架搭建API

Koa2是目前Node.js世界最火的web框架,不管從性能,仍是流程控制上,koa 2和它的後宮(中間件)都是很是好的解決方案。本文主要koa 2的文檔解讀和runkoa介紹,讓你們對koa 2有一個更簡單直接的理解前端

1.項目目錄生成

搭建一個項目首先要要清楚地創建起一個文件系統目錄,這樣纔會清晰明瞭地安放項目的文件路徑,對項目的結構也有所明確。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

  1. app用於存放前端的JavaScript視圖模板mongodb

  2. controllers用於存放後臺的控制器數據庫

  3. modules是數據的原型npm

  4. public用於存放靜態資源json

  5. routers用於存放路由系統api

  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'//引入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方法,數據模型,關係存儲以及安全權限驗證了,接下來的開發過程當中會進一步補充這一系列的總結。

相關文章
相關標籤/搜索