国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

EDU_BOOK 開發(fā)總結

Yumenokanata / 589人閱讀

摘要:開發(fā)總結整體框架搭建是目前世界最火的框架,無論從性能,還是流程控制上,和它的后宮中間件都是非常好的解決方案。

EDU_BOOK 開發(fā)總結 KOA2 + Mongodb 整體框架搭建API

Koa2是目前Node.js世界最火的web框架,無論從性能,還是流程控制上,koa 2和它的后宮(中間件)都是非常好的解決方案。本文主要koa 2的文檔解讀和runkoa介紹,讓大家對koa 2有一個更簡單直接的理解

1.項目目錄生成

搭建一個項目首先要要清楚地建立起一個文件系統(tǒng)目錄,這樣才會清晰明了地安放項目的文件路徑,對項目的結構也有所明確。

項目暫時的文件目錄如下:

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是數(shù)據(jù)的原型

public用于存放靜態(tài)資源

routers用于存放路由系統(tǒng)

app.js是后臺的入口文件

config.js是配置文件

start.js用于es6和es7babel轉換

2.Koa2的搭建

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

npm --save-dev install koa@next

(2) 接著安裝koa的路由系統(tǒng)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

這時候我們已經(jīng)安裝好koa2框架的基本使用需求依賴包了。但是我們要怎么在node環(huán)境中運行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的服務編寫

我們之前已經(jīng)說過了,app.js是入口文件,一起來看看吧!

import Koa from "koa"http://引入koa2


const app = new Koa();

app.listen(3000);

console.log("app started at port 3000...");

這樣Koa的服務運行就開啟了!可是這樣遠遠是無法為web提供api的,我們首先需要的是路由系統(tǒng)。

4.Koa2的路由系統(tǒng)搭建

之前已經(jīng)安裝了koa-router支持koa2的路由系統(tǒng)npm包

于是app.js就變?yōu)?

import Koa from "koa"
import bodyParser from "koa-bodyparser" //用于解析request中body的數(shù)據(jù)
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" //引入路由系統(tǒng)文件

mongoose.connect(`mongodb://${config.mongodb.host}:${config.mongodb.port}/${config.mongodb.dbname}`); //從配置文件中加載數(shù)據(jù)連接數(shù)據(jù)庫

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...");

接下來看主要部分,路由系統(tǒng)

(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" //加載數(shù)據(jù)原型
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:

`; }

當我們搭建好各種路由響應后就要配置數(shù)據(jù)庫了。

5.Mongoose數(shù)據(jù)庫搭建

要用mongoose鏈接并搭建數(shù)據(jù)庫得先建立一個數(shù)據(jù)原型:

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;

這樣當我們需要寫入或查詢數(shù)據(jù)時就先引入數(shù)據(jù)原型,然后創(chuàng)建數(shù)據(jù)原型的新對象,進行匹配后如果正確就可以保存到數(shù)據(jù)庫中:

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進行異步操作保存數(shù)據(jù)到數(shù)據(jù)庫
  if(result && result._id) {
    console.log(result._id);
    console.log("success");
    ctx.response.redirect("/login");
  } else {
    console.log("郵箱或用戶名已經(jīng)被注冊過了!!!");
  }

查找數(shù)據(jù):

 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進行異步操作查詢數(shù)據(jù)庫中的數(shù)據(jù)
    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方法,數(shù)據(jù)模型,關系存儲以及安全權限驗證了,接下來的開發(fā)過程中會進一步補充這一系列的總結。

文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/18895.html

相關文章

  • 【經(jīng)驗分享】測試人員如何寫總結

    摘要:參與者項目經(jīng)理產品經(jīng)理開發(fā)經(jīng)理測試經(jīng)理及其它相關人員。項目上線后問題反饋針對項目客戶反饋問題進行分析總結,類似缺陷分析,重點總結遺漏的原因及后需的規(guī)避措施。六匯總整理各部門總結并發(fā)布基于測試總結過程中的數(shù)據(jù)分析,我們提出了對部門的建議。 最近參與了幾次面試,面試者的簡歷中都會提及:需求或者...

    Vixb 評論0 收藏0
  • 2016年總結 - 收藏集 - 掘金

    摘要:然而這次的文章,就像賀師俊所說的這篇文章是從程序員這個老年度總結前端掘金年對我來說,是重要的一年。博客導讀總結個人感悟掘金此文著筆之時,已經(jīng)在眼前了。今天,我就來整理一篇,我個人認為的年對開發(fā)有年終總結掘金又到 2016 Top 10 Android Library - 掘金 過去的 2016 年,開源社區(qū)異?;钴S,很多個人與公司爭相開源自己的項目,讓人眼花繚亂,然而有些項目只是曇花一...

    DataPipeline 評論0 收藏0
  • Java 初學者做的第一個微信小程序總結--關于Java基礎

    摘要:官方資料微信公眾平臺注冊小程序。官網(wǎng)開發(fā)文檔社區(qū)開發(fā)工具部署微信小程序微信小程序本身不需要部署,在微信開發(fā)工具中直接上傳代碼就行。 為什么 學習 Java 三年,目前已經(jīng)工作了2年,因為自學,基礎差,所以打算年末總結一下常見的基礎知識和面試點; 也可以通過獨立做一個項目整合自己工作期間學習的知識,加深印象。 但是想著回家或是平時手機用的多,做一款APP和小程序很方便查看。 項目展示 本...

    mudiyouyou 評論0 收藏0
  • vue開發(fā)微信商城項目總結之三--根據(jù)不同的開發(fā)環(huán)境做配置

    摘要:項目是基于搭建,項目分為開發(fā)環(huán)境,測試環(huán)境,預生產環(huán)境,生產環(huán)境,其中開發(fā)環(huán)境和測試環(huán)境調用同一個接口,開發(fā)環(huán)境調用服務器端的測試接口會跨域,以上需求就引發(fā)了一些問題,問題一測試環(huán)境包括開發(fā)環(huán)境,并且開發(fā)環(huán)境跨域,預生產環(huán)境,生產環(huán)境,有 項目是基于vue-cli搭建,項目分為開發(fā)環(huán)境,測試環(huán)境,預生產環(huán)境,生產環(huán)境,其中開發(fā)環(huán)境和測試環(huán)境調用同一個接口,開發(fā)環(huán)境調用服務器端的測試接口...

    Magicer 評論0 收藏0
  • 微信小程序項目總結(一)

    摘要:前言微信小程序的開發(fā),我應該算是趕上了第一波,所以,自然是一路踩坑而來。注以下標題是按照微信開發(fā)工具上的選項進行劃分的。不過,除此之外,它還會產生另外一個副作用,就是可能連小程序本身上的請求都請求不了了。 -- KChris 2017.3.16 (=^.^=) 前言微信小程序的開發(fā),我應該算是趕上了第一波,所以,自然是一路踩坑而來 =。=一月九日,小程序正式上線,早早地就到公司開始改b...

    whatsns 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<