文档章节

Moa-api:一个基于node express快速开发api类后端的框架

i5ting
 i5ting
发布于 2015/08/05 20:14
字数 1067
阅读 946
收藏 25

Moa-api:一个基于node express快速开发api类后端的框架

输入图片说明

项目地址:https://github.com/moajs/moa-api

目前是让开发可以快速的开发api类后端,开箱即用,可以最大程度发挥node express的威力

技术栈

  • express
  • mongoose
  • bluebird
  • res.api

Features

  • 自动加载路由
  • 支持mongodb配置
  • 集成mongoosedao,快速写crud等dao接口
  • 自带用户管理
  • 使用jsonwebtoken做用户鉴权
  • 支持migrate测试
  • 支持mocha测试
  • 默认集成res.api,便于写接口
  • 集成supervisor,代码变动,自动重载
  • gulp自动监控文件变动,跑测试
  • gulp routes生成路由说明

开发流程

  • 确定models内容,如果是已有库或已有模型,可以直接使用
  • 编写接口文档
  • 通过migrate来测试model里的方法(如果测试熟悉,可以直接写测试)
  • 通过supertest来测试接口(R层)是否合法
  • 通过mocha测试其他业务代码(C层、S层、M层)

RCSM分层思想

R = routes

路由层,和express的一样,唯一不一样的是只要是在app/routes下面的js都会自动挂载到路由上。

比如app/routes/user.js,它的访问地址是

http://127.0.0.1:3000/user

比如app/routes/api/user.js,它的访问地址是

http://127.0.0.1:3000/api/user

然后路由里面的子地址,参照express路由写法即可。

典型用法是

var express = require('express');
var router = express.Router();

var $ = require('mount-controllers')(__dirname).users_controller;

/* GET users listing. */
router.get('/login', $.api.login);

router.get('/register', function(req, res, next) {
  return res.api(200,{
  	a:'register'
  });
});

module.exports = router;

从使用上来说,router.get('/login', $.api.login);这个是最合理最常用的的。

但如果是逻辑非常简单的路由,随便写写也无妨

C = controllers

控制层,主要是负责接口处理结果如何返回,异常如何处理等逻辑控制,不处理具体逻辑

var users_service = require('mount-services')(__dirname).users_service;

// -- custom api
exports.api = {
  login: function (req, res, next) {
    // var user_id = req.api_user._id;
    
    var is_valid = users_service.login_valid('sang', '000000');
    
    if(is_valid == true){
      return res.api(200,{
      	a:'login true'
      });
    }else{
      return res.api(200,{
      	a:'login false '
      });
    }
  }
}

说明:控制层的代码只会在R层里用到

S = services

业务逻辑层,通常业务比较负责才会用到业务逻辑层的,如果是单表能处理的,就没有必要使用services层了,所以S层通常是多个models操作的业务逻辑,为了逻辑清晰,以及防止C层膨胀,和耦合,S层很多时候是必要的。

说明:S层只会出现在C层代码里,是对多个models操作的封装。

M = models

模型层,也就是我们常说的dao层,即data access object,这里采用mongoose + mongoosedao完成model层建模

说明:M层可能出现在S层或C层,不允许出现在其他位置

auth权限

用户管理

http://127.0.0.1:3000/users

鉴权接口

获取token作为以后的api授权凭证

获取请求api接口,可以通过header或参数授权

//检查post的信息或者url查询参数或者头信息
var token = req.body.token || req.query.token || req.headers['x-access-token'];

下面给出参数的测试方式

➜  moa-api git:(master) ✗ curl -d "username=sang&password=000000" http://127.0.0.1:3000/api/auth
{"success":true,"message":"Enjoy your token!","token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJfaWQiOiI1NWMxOWZkZTNkYWMxZGViMDhjNDM4ODkiLCJ1c2VybmFtZSI6InNhbmciLCJwYXNzd29yZCI6IjAwMDAwMCIsImF2YXRhciI6IiIsInBob25lX251bWJlciI6IiIsImFkZHJlc3MiOiIiLCJfX3YiOjB9.ocfeQ_Kx00edNfbwDtpTrxXxotfOAo2a_zni9Ujsxwg"}%                                                       

token = eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJfaWQiOiI1NWMxOWZkZTNkYWMxZGViMDhjNDM4ODkiLCJ1c2VybmFtZSI6InNhbmciLCJwYXNzd29yZCI6IjAwMDAwMCIsImF2YXRhciI6IiIsInBob25lX251bWJlciI6IiIsImFkZHJlc3MiOiIiLCJfX3YiOjB9.ocfeQ_Kx00edNfbwDtpTrxXxotfOAo2a_zni9Ujsxwg

R层鉴权示例

var express = require('express');
var router = express.Router();

var $middlewares  = require('mount-middlewares')(__dirname);

var $ = require('mount-controllers')(__dirname).users_controller;

/* GET users listing. */
router.get('/login', $middlewares.check_api_token, $.api.login);

module.exports = router;

测试获取用户信息接口

curl http://127.0.0.1:3000/api/users?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJfaWQiOiI1NWMxOWZkZTNkYWMxZGViMDhjNDM4ODkiLCJ1c2VybmFtZSI6InNhbmciLCJwYXNzd29yZCI6IjAwMDAwMCIsImF2YXRhciI6IiIsInBob25lX251bWJlciI6IiIsImFkZHJlc3MiOiIiLCJfX3YiOjB9.ocfeQ_Kx00edNfbwDtpTrxXxotfOAo2a_zni9Ujsxwg

返回结果

// 20150805133902
// http://127.0.0.1:3000/api/users?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJfaWQiOiI1NWMxOWZkZTNkYWMxZGViMDhjNDM4ODkiLCJ1c2VybmFtZSI6InNhbmciLCJwYXNzd29yZCI6IjAwMDAwMCIsImF2YXRhciI6IiIsInBob25lX251bWJlciI6IiIsImFkZHJlc3MiOiIiLCJfX3YiOjB9.ocfeQ_Kx00edNfbwDtpTrxXxotfOAo2a_zni9Ujsxwg

{
  "data": {
    "users": [
      {
        "_id": "55c19fd43dac1deb08c43888",
        "username": "12",
        "password": "2",
        "avatar": "23",
        "phone_number": "23",
        "address": "",
        "__v": 0
      },
      {
        "_id": "55c19fde3dac1deb08c43889",
        "username": "sang",
        "password": "000000",
        "avatar": "",
        "phone_number": "",
        "address": "",
        "__v": 0
      }
    ]
  },
  "status": {
    "code": 0,
    "msg": "request success!"
  }
}

migrate

当需要确定model里mongoose接口是否正确的时候,可以考虑创建一个migrate

node migrate/bill_in_account.js 

如果是复杂的业务逻辑放到测试里。

task

list api routes

gulp routes

Screen Shot 2015-08-05 at 2.19.54 PM.png

test

gulp

或者下面这样也行

➜  moa-api  mocha test/controller
提醒:debug状态连接数据库:
mount routes_folder_path = /Users/sang/workspace/github/moa-api/app/routes


  GET /users
[mongoose log] Successfully connected to:  NaN
mongoose open success
set api header
GET /api/user/login 200 4.529 ms - 40
    ✓ respond with json


  1 passing (33ms)

more

see http://nodeonly.com/2015/06/14/node-restful-api.html

全文完

欢迎关注我的公众号【node全栈】

node全栈.png

© 著作权归作者所有

上一篇: nodejs里的repl
i5ting
粉丝 194
博文 68
码字总数 98509
作品 3
东城
私信 提问
加载中

评论(1)

流花飘原
流花飘原
牛🐮!
moa-api 1.0.0 发布,Web API 快速开发框架

moa-api : 一个基于 node express 快速开发 api 类后端的框架,适用于 Angularjs 和 ionic 等前后端分离的项目。 moa-api 是一个简洁强大的 web api 框架,它内置了 mongoosedao,自动挂载路...

i5ting
2015/08/12
3K
4
全栈工程师之路-Node.js

全栈工程师之路-Node.js 高可用架构专用 原文[高可用架构] https://mp.weixin.qq.com/s?biz=MzAwMDU1MTE1OQ==&mid=405001493&idx=1&sn=f0ecab9b31bad83fb065ac37bb728245&scene=1&srcid=032......

i5ting
2016/04/08
277
0
全栈工程师之路-Node.js

全栈工程师之路-Node.js 高可用架构专用 原文[高可用架构] https://mp.weixin.qq.com/s?_biz=MzAwMDU1MTE1OQ==&mid=405001493&idx=1&sn=f0ecab9b31bad83fb065ac37bb728245&scene=1&srcid=03......

i5ting
2016/04/08
192
1
Nodejs框架演进之路

Nodejs框架演进之路 大部分框架的演进之路大体都是一样的 实现(土方法) 实践(项目实操) 看齐最佳实践 不断封装、造轮子 走出自己的特色 下面简单的介绍一下moajs的演进之路 什么是Moajs...

i5ting
2015/12/26
207
0
超全!基于Java的机器学习项目、环境、库...

https://yq.aliyun.com/articles/278837?utmsource=tuicool&utmmedium=referral 摘要: 你是一名希望开始或者正在学习机器学习的Java程序员吗? 利用机器学习编写程序是最佳的学习方式。你可...

u011001084
2017/12/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

记录"正则表达式"

详细请查看我的博客:https://blog.enjoytoshare.club/article/RegularExpression.html 1 写在前面 正则表达式(Regular Expression)在代码中常常简写为regex。正则表达式通常被用来检索、替...

wugenqiang
9分钟前
0
0
linux clamav 免费查毒工具

linux下需要杀毒工具吗?我一直认为是不要的,基于linux的病毒很少,linux 安全防护也做的很好,一般很难功破。我想那些黑客们更喜欢,写windows下的病毒,用的人多啊,传播也容易。下面的操...

老孟的Linux私房菜
12分钟前
0
0
关于连接PostgreSQL时提示 FATAL: password authentication failed for user "连接用户名" 的解决办法

关于连接PostgreSQL时提示 FATAL: password authentication failed for user "连接用户名" 的解决方法 今天帮一个同学解决了一个FATAL: password authentication failed for user "连接用户名......

dragon_tech
16分钟前
0
0
聊聊jest的IdleConnectionReaper

序 本文主要研究一下jest的IdleConnectionReaper IdleConnectionReaper jest-common-6.3.1-sources.jar!/io/searchbox/client/config/idle/IdleConnectionReaper.java public class IdleCon......

go4it
23分钟前
0
0
android 事件分发

记录下对Android事件分发的理解: 如果a作为viewgroup,b作为view,b包含在a中。事件会先传递到viewgroup中,既a。然后a会进行事件分发给子view。事件分发的方法中,会有个判断,是否要分发给...

醉雨
36分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部