nodejs實現restful API


更新:
最新的源碼和使用說明放到了github上 點擊跳轉
本文的重點在於restful接口的設計與實現,使用到了express和monogoose.
點擊查看express教程
點擊查看monogoose教程
ES6入門教程----阮一峯的博客html

node4.x對ES6的支持並不完善,建議使用更高版本的node
在實際開發中請在文件頭部添加'use strict'來聲明使用嚴格模式
爲了有助於更好的理解後期的代碼,咱們首先來學習一下ES6的類與繼承前端

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的模塊

其次學習一下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

相關文章
相關標籤/搜索