资讯专栏INFORMATION COLUMN

EDU_BOOK 开发总结

Yumenokanata / 490人阅读

摘要:开发总结整体框架搭建是目前世界最火的框架,无论从性能,还是流程控制上,和它的后宫中间件都是非常好的解决方案。

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 = `

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方法,数据模型,关系存储以及安全权限验证了,接下来的开发过程中会进一步补充这一系列的总结。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/18895.html

相关文章

  • 【经验分享】测试人员如何写总结

    摘要:参与者项目经理产品经理开发经理测试经理及其它相关人员。项目上线后问题反馈针对项目客户反馈问题进行分析总结,类似缺陷分析,重点总结遗漏的原因及后需的规避措施。六汇总整理各部门总结并发布基于测试总结过程中的数据分析,我们提出了对部门的建议。 最近参与了几次面试,面试者的简历中都会提及:需求或者...

    Vixb 评论0 收藏0
  • 2016年总结 - 收藏集 - 掘金

    摘要:然而这次的文章,就像贺师俊所说的这篇文章是从程序员这个老年度总结前端掘金年对我来说,是重要的一年。博客导读总结个人感悟掘金此文着笔之时,已经在眼前了。今天,我就来整理一篇,我个人认为的年对开发有年终总结掘金又到 2016 Top 10 Android Library - 掘金 过去的 2016 年,开源社区异常活跃,很多个人与公司争相开源自己的项目,让人眼花缭乱,然而有些项目只是昙花一...

    DataPipeline 评论0 收藏0
  • Java 初学者做的第一个微信小程序总结--关于Java基础

    摘要:官方资料微信公众平台注册小程序。官网开发文档社区开发工具部署微信小程序微信小程序本身不需要部署,在微信开发工具中直接上传代码就行。 为什么 学习 Java 三年,目前已经工作了2年,因为自学,基础差,所以打算年末总结一下常见的基础知识和面试点; 也可以通过独立做一个项目整合自己工作期间学习的知识,加深印象。 但是想着回家或是平时手机用的多,做一款APP和小程序很方便查看。 项目展示 本...

    mudiyouyou 评论0 收藏0
  • vue开发微信商城项目总结之三--根据不同的开发环境做配置

    摘要:项目是基于搭建,项目分为开发环境,测试环境,预生产环境,生产环境,其中开发环境和测试环境调用同一个接口,开发环境调用服务器端的测试接口会跨域,以上需求就引发了一些问题,问题一测试环境包括开发环境,并且开发环境跨域,预生产环境,生产环境,有 项目是基于vue-cli搭建,项目分为开发环境,测试环境,预生产环境,生产环境,其中开发环境和测试环境调用同一个接口,开发环境调用服务器端的测试接口...

    Magicer 评论0 收藏0
  • 微信小程序项目总结(一)

    摘要:前言微信小程序的开发,我应该算是赶上了第一波,所以,自然是一路踩坑而来。注以下标题是按照微信开发工具上的选项进行划分的。不过,除此之外,它还会产生另外一个副作用,就是可能连小程序本身上的请求都请求不了了。 -- KChris 2017.3.16 (=^.^=) 前言微信小程序的开发,我应该算是赶上了第一波,所以,自然是一路踩坑而来 =。=一月九日,小程序正式上线,早早地就到公司开始改b...

    whatsns 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<