更新:
最新的源码和使用说明放到了github上 点击跳转
本文的重点在于restful接口的设计与实现,使用到了express和monogoose.
点击查看express教程
点击查看monogoose教程
ES6入门教程----阮一峰的博客html
node4.x对ES6的支持并不完善,建议使用更高版本的node
在实际开发中请在文件头部添加'use strict'来声明使用严格模式
为了有助于更好的理解后期的代码,咱们首先来学习一下ES6的类与继承前端
1.定义与使用node
//定义一个基类 class BaseService{ add(){ console.log('base add');// base add } remove(){ console.log('base remove') // base remove } } //实例化 var base = new BaseService(); base.add(); //输出 'base add'
2.继承git
//重载基类的方法 //添加私有方法 class UserServie extends BaseService{ add(){ console.log('user add');// user add } findTop5(){ console.log('1,2,3,4,5');// 1,2,3,4,5 } }
其次学习一下node里的模块,若是要使用ES6的模块,你须要额外使用babeles6
1.导出基类
新建baseService.jsgithub
class Service{ add(){ console.log('base add');// base add } remove(){ console.log('base remove') // base remove } } exports.service = Service;
2.在子类中引用基类
新建userService.jsmongodb
var baseService = require('./baseService').service; class Service extends baseService{ findTop5(){ console.log('1,2,3,4,5');// 1,2,3,4,5 } add(){ console.log('user add');// user add } } exports.service = Service;
下面将会使用到monogoose和express相关技术,不懂的能够看本文顶部连接
1.使用express初始化项目以后添加models文件夹和services文件夹
在models文件夹内新建userModel.jsexpress
var mongoose = require('mongoose'); var Schema = mongoose.Schema; var model = new Schema({ name:String }); exports.model = mongoose.model('userModel', model);
在services文件夹内新建baseService.jsjson
var mongoose = require('mongoose'); var Schema = mongoose.Schema; class Service{ constructor(){ } add(obj, name,callback){ var name = name || ''; var result = {}; var instance = this.entity(obj); instance.save(function(err, item, numAffected) { if (err) { result = { 'ok': false, 'data': {}, 'message': '新增' + name + '失败' } } else { result = { 'ok': true, 'data': item, 'message': '新增' + name + '成功' } } callback(result); }); } delete(obj, name,callback){ var result = {}; var id = obj.id; this.entity.remove({ '_id': id }, function(err) { if (err) { result = { 'ok': false, 'data': {}, 'message': '删除' + name + '失败' }; } else { result = { 'ok': true, "data": {}, 'message': '删除' + name + '成功' }; } callback(result); }); } } exports.service = Service;
而后新建userService.js,引用对应的model,而且实现userService对baseService的继承api
var baseService = require('./baseService').service; var mongoose = require('mongoose'); var Schema = mongoose.Schema; var model = require('../models/userModel').model; class Service extends baseService{ constructor(){ super(); this.entity = model; } } exports.service = Service;
在userService.js中咱们能够重写基类的方法,也能够添加本身私有的方法和属性
在上文中已经提到过,下面再来熟悉一遍吧
若是要在子类中调用this,须要先调用super方法,不然新建实例时会报错。这是由于子类没有本身的this对象,而是继承父类的this对象,而后对其进行加工。若是不调用super方法,子类就得不到this对象。
class Service extends baseService{ constructor(){ super(); this.entity = model; } add(){ console.log('user add'); } findTop5(){ console.log('1,2,3,4,5'); } }
接着再新建services.js文件来统一对外导出service ,下面代码是实际项目中的代码,仅做为参照
exports.userService = require('./userService').service; exports.emptyService = require('./emptyService').service; exports.themeService = require('./themeService').service; exports.documentService = require('./documentService').service; exports.chartTypeService = require('./chartTypeService').service; exports.mapTypeService = require('./mapTypeService').service; exports.pageService = require('./pageService').service; exports.cellService = require('./cellService').service; exports.defaultEchartTypeService = require('./defaultEchartTypeService').service; exports.defaultMapTypeService = require('./defaultMapTypeService').service; exports.issueService = require('./issueService').service;
最后是路由了,在routes文件夹内新建api.js文件
var express = require('express'); var router = express.Router(); var Services = require('../services/services'); mongoose.connect('mongodb://localhost/test'); /* listen all name 名称 method 方法 par 参数 entity 实体实例 service 服务实例 result 返回结果 obj 请求参数 参数为空或者错误时调用empty 防止程序崩溃 */ router.post('/:name?/:method?/:par?',function(req,res,next){ var name = req.params.name || 'empty'; var method = req.params.method || 'empty'; var par = req.params.par || ''; var service = new Services[name+'Service'](); var obj = req.body || {}; obj.par = par; if(!Services[name+'Service']){ service = new Services.emptyService(); } service[method](obj,name,function(result){ res.json(result); }); return; }); module.exports = router;
在代码中,咱们引用了Services,
首先经过new Services[name+'Service']()
来实例化对应的service
而后调用service[method]
方法,
其中:name?、:method?、:par?
为占位符
在前端页面中,咱们能够使用$.post('/api/user/add',data,function(){})
这个典型的方法来测试一下API是否能够正常运行,做者比较喜欢将参数所有放在data中
有疑问或者不解的能够发邮件到http_wenwen@163.com