更新:
最新的源碼和使用說明放到了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