nodejs實現restful API


nodejs實現restful API

標簽(空格分隔): javascript node


下載項目
本文的重點在於restful接口的設計與實現,使用到了express和monogoose.
點擊查看express教程
點擊查看monogoose教程
ES6入門教程----阮一峰的博客

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

ES6的類與繼承

1.定義與使用

//定義一個基類
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.繼承

//重載基類的方法
//添加私有方法
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的模塊,你需要額外使用babel

1.導出基類
新建baseService.js

class Service{
    add(){
        console.log('base add');// base add
    }
    remove(){
        console.log('base remove') // base remove
    }
}
exports.service = Service;

2.在子類中引用基類
新建userService.js

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.js

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var model = new Schema({
     name:String    
});
exports.model = mongoose.model('userModel', model);

在services文件夾內新建baseService.js

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的繼承

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM