Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

node构件RESTful风格API接口 #34

Open
Copyes opened this issue Jun 29, 2017 · 0 comments
Open

node构件RESTful风格API接口 #34

Copyes opened this issue Jun 29, 2017 · 0 comments

Comments

@Copyes
Copy link
Owner

Copyes commented Jun 29, 2017

RESTful的定义

一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。使用的是标准的 HTTP 方法,比如 GET、PUT、POST 和 DELETE。

  • GET
    向特定的资源发出请求。注意:GET方法不应当被用于产生“副作用”的操作中,例如在web app.中。其中一个原因是GET可能会被网络蜘蛛等随意访问
  • POST
    向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改
  • PUT
    向指定资源位置上传其最新内容
  • DELETE
    请求服务器删除Request-URI所标识的资源

MVC软件设计模式

MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建 Web 应用程序的模式:

  • Model(模型)表示应用程序核心(比如数据库记录列表)。
  • View(视图)显示数据。
  • Controller(控制器)处理输入(写入数据库记录)。
  • Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。
      通常模型对象负责在数据库中存取数据。
  • View(视图)是应用程序中处理数据显示的部分。
      通常视图是依据模型数据创建的。
  • Controller(控制器)是应用程序中处理用户交互的部分。
      通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

环境安装

  • node
  • mysql
  • postman (工具)
  • sequel (工具)

文件目录构件

---server
    ---config   存放数据库连接配置文件
        ---dev
        ---prod
        ---index.js
    ---db       直接连接数据库操作
        ---db.js
    ---controllers 控制器
        ---xxxController.js
    ---models   直接操作数据库
        ---xxxModel.js
    ---routes   路由配置
        ---xxx.js
    ---schema   表结构
        ---table.js
    ---utils    工具库
    ---server.js 服务启动

起步

1、 先说下web框koa

koa 是由 Express 原班人马打造的,致力于成为一个更小、更富有表现力、更健壮的 Web 框架。使用 koa 编写 web 应用,通过组合不同的 generator,可以免除重复繁琐的回调函数嵌套,并极大地提升错误处理的效率。koa 不在内核方法中绑定任何中间件,它仅仅提供了一个轻量优雅的函数库,使得编写 Web 应用变得得心应手。

koa2里面支持async和await,毕竟这个是取代koa1使用co配合generator的一种过度方式。

这里就讲下koa1来做吧。

2、起个服务

首先要做的是:

  • 引入各种中间件
    koa-bodyparse
    koa-router
    koa

  • 编写node服务器脚本app.js

const Koa = require('koa')
const app = new Koa()

app.use(  function* ( next ) {
  //this.body = 'hello koa';
  let start = new Date();
    yield next;
    let ms = new Date() - start;
    console.log('%s %s - %s', this.method, this.url, ms);
})

app.listen(3000)
console.log('[demo] start-quick is starting at port 3000')

3、路由的配置

上面就是启动了一个简单的web服务,我们平时调用接口的时候是http://api.xxx.com/api/xxxx/:page

引入路由中间件,并设置你要拦截的请求

const router = require('koa-router')();
const api = require('./routes/api.js');

router.use('/api', api.routes());

这个时候所有的请求中带有/api的都被拦截,然后走这个对应的路由中间件,我们在这个对应的路由中间件中定义操作方法比如常见的增删改查这一套。

比如说你的请求的接口是:
http://api.xxx.com/api/list/:page
我们对应的api这个路由中间件里面就定义的有

    router.get('/list/:page', getList);

换句话说简单的理解,我们请求http://api.xxx.com/api/list/:page
会被映射到getList方法上,这个方法就定义在我们的控制器里面的。

4、控制器

按照以往我写后端的套路controller里面我制作一些校验啊之类的简单操作,不做复杂的逻辑处理之类的。然后对应的方法返回对应的值。

const xxxModel = require('xxxModel');
const getList = function *(){
    let page = this.params.page;
    let lists = yield xxxModel.getAllList();
}

这个里面的model就是来自于表操作的数据实例。对应的控制器有对应的model。按照更好的架构设计,复杂的逻辑处理都应该单独拆个service层。真的model就是只拿最原始的数据实例,不做处理的。

5、model数据实例层

这里我没有做复杂的拆分。把一些逻辑处理也放在这里面的,这是不合适的。
本来这一层只用于获取原始数据的

const getAllList = function* (page){
    const pageSize = 20;
    const List = yield XXXX.findAll({
        'where' : {
            'del_flag': 0
        },
        'order': 'gmt_create DESC', 
        'limit' : pageSize,
        'offset': pageSize * (page - 1)
    });
    return List;
}

上面我用的是一个ORM(sequelize),操作数据库的,让不会写sql的也可以玩CURD。

6、连接数据库,倒入表结构

前面我已经把数据库连接操作放在了db.js里面了。所以这里直接引入就好了。

const db = require('../db/db.js');
// 导入表结构
const xxxTable = '../schema/xxx_table.js';
// 引入表实例
const xxxTableModel = db.database.import(xxxTable);

这里我们就连接好对应的数据库,以及可以操作表啦。

之前我们先建好数据库里面的表,但是要手动把表结构写出来,这个就很伤了,可能并不会对不对。sequelize,使用这个东西很方便就可以自动根据数据库里面的表字断生成表结构,很爽。

下面是命令:

equelize-auto -o "./schema" -d beibei -t 表名 -h 域名 -u 用户名 -p 3306 -x 密码 -e mysql

这个时候基本就大功告成了。但是~~你的数据库没有数据的话那还是只有gg。这个时候想要数据对不对,哈哈写个简单的爬虫吧~

最后

这个只是一个node写接口的简单入门,没有涉及到很深,什么并发控制啊,鉴权啊,session啊那些东西,另外用node来做单元测试也是很舒服的

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant