成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

nodejs實(shí)現(xiàn)restful API

harriszh / 602人閱讀

更新:
最新的源碼和使用說明放到了github上 點(diǎn)擊跳轉(zhuǎn)
本文的重點(diǎn)在于restful接口的設(shè)計(jì)與實(shí)現(xiàn),使用到了express和monogoose.
點(diǎn)擊查看express教程
點(diǎn)擊查看monogoose教程
ES6入門教程----阮一峰的博客

node4.x對ES6的支持并不完善,建議使用更高版本的node
在實(shí)際開發(fā)中請?jiān)谖募^部添加"use strict"來聲明使用嚴(yán)格模式
為了有助于更好的理解后期的代碼,我們首先來學(xué)習(xí)一下ES6的類與繼承

ES6的類與繼承

1.定義與使用

//定義一個(gè)基類
class BaseService{
    add(){
        console.log("base add");// base add
    }
    remove(){
        console.log("base remove") // base remove
    }
}
//實(shí)例化
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的模塊

其次學(xué)習(xí)一下node里的模塊,如果要使用ES6的模塊,你需要額外使用babel

1.導(dǎo)出基類
新建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;
搭建項(xiàng)目結(jié)構(gòu)

下面將會(huì)使用到monogoose和express相關(guān)技術(shù),不懂的可以看本文頂部鏈接
1.使用express初始化項(xiàng)目之后添加models文件夾和services文件夾
在models文件夾內(nèi)新建userModel.js

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

在services文件夾內(nèi)新建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,引用對應(yīng)的model,并且實(shí)現(xiàn)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中我們可以重寫基類的方法,也可以添加自己私有的方法和屬性
在上文中已經(jīng)提到過,下面再來熟悉一遍吧
如果要在子類中調(diào)用this,需要先調(diào)用super方法,否則新建實(shí)例時(shí)會(huì)報(bào)錯(cuò)。這是因?yàn)樽宇悰]有自己的this對象,而是繼承父類的this對象,然后對其進(jìn)行加工。如果不調(diào)用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文件來統(tǒng)一對外導(dǎo)出service ,下面代碼是實(shí)際項(xiàng)目中的代碼,僅作為參照

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文件夾內(nèi)新建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     參數(shù)
    entity  實(shí)體實(shí)例
    service 服務(wù)實(shí)例
    result  返回結(jié)果
    obj     請求參數(shù)
    參數(shù)為空或者錯(cuò)誤時(shí)調(diào)用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"]()來實(shí)例化對應(yīng)的service
然后調(diào)用service[method]方法,
其中:name?、:method?、:par? 為占位符
在前端頁面中,我們可以使用$.post("/api/user/add",data,function(){})這個(gè)典型的方法來測試一下API是否可以正常運(yùn)行,作者比較喜歡將參數(shù)全部放在data中
有疑問或者不解的可以發(fā)郵件到[email protected]

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/84514.html

相關(guān)文章

  • 快速學(xué)習(xí)nodejs系列:十三、nodejs實(shí)現(xiàn)restful api、cookie、session

    摘要:在前面的節(jié)課程里面,我們已經(jīng)基本學(xué)習(xí)完了的知識(shí),達(dá)到基礎(chǔ)入門的要求。英語的直譯就是表現(xiàn)層狀態(tài)轉(zhuǎn)移。的特點(diǎn)不加密用戶可刪除可被修改依賴于用戶禁用或清除時(shí),讀取出錯(cuò)。下節(jié),會(huì)開始學(xué)習(xí)框架。 在前面的12節(jié)課程里面,我們已經(jīng)基本學(xué)習(xí)完了nodejs的知識(shí),達(dá)到基礎(chǔ)入門的要求。那為什么會(huì)在這節(jié)說下使用nodejs來實(shí)現(xiàn)一些功能,而不繼續(xù)往下講呢?原因有2:1.前面講地都是理論知識(shí),碼代碼比較少...

    asce1885 評論0 收藏0
  • 4.3 路由設(shè)計(jì)/RESTful API-博客后端Api-NodeJs+Express+Mysql實(shí)

    摘要:路由設(shè)計(jì)路由設(shè)計(jì)以用戶注冊為例介紹如何閉環(huán)用戶注冊開發(fā)注意點(diǎn)使用郵箱注冊驗(yàn)證郵箱是否注冊目前真實(shí)開發(fā)業(yè)務(wù)大部分都是手機(jī)號(hào)注冊,這塊由于沒有購買短信服務(wù)首先,在文件夾下新建上圖中對應(yīng)真實(shí)業(yè)務(wù)邏輯現(xiàn)附上業(yè)務(wù)實(shí)現(xiàn)代碼加密國際化工具類用戶服務(wù) 路由設(shè)計(jì) 路由設(shè)計(jì) 以用戶注冊為例介紹如何閉環(huán)用戶注冊開發(fā)注意點(diǎn):(1)使用郵箱注冊(2)驗(yàn)證郵箱是否注冊 【目前真實(shí)開發(fā)業(yè)務(wù)大部分都是手機(jī)號(hào)注冊,這塊...

    1fe1se 評論0 收藏0
  • 前后端的分離模式

    摘要:采用前后端分離模式可以減后臺(tái)負(fù)擔(dān),加快研發(fā)效率,當(dāng)然,前提是前端能做好的話。還是基礎(chǔ)不夠?qū)е碌暮蠖耸欠耧L(fēng)格很多公司采用了前后端分離模式后,后端仍然采用以往的傳統(tǒng)風(fēng)格,這是不合理的,風(fēng)格的應(yīng)該是前后端分離的最佳實(shí)踐。 showImg(https://segmentfault.com/img/bVFC8f?w=690&h=360);早期的web開發(fā)是不分前端后端的?;ヂ?lián)網(wǎng)進(jìn)入Web2.0時(shí)...

    fobnn 評論0 收藏0
  • 前后端的分離模式

    摘要:采用前后端分離模式可以減后臺(tái)負(fù)擔(dān),加快研發(fā)效率,當(dāng)然,前提是前端能做好的話。還是基礎(chǔ)不夠?qū)е碌暮蠖耸欠耧L(fēng)格很多公司采用了前后端分離模式后,后端仍然采用以往的傳統(tǒng)風(fēng)格,這是不合理的,風(fēng)格的應(yīng)該是前后端分離的最佳實(shí)踐。 showImg(https://segmentfault.com/img/bVFC8f?w=690&h=360);早期的web開發(fā)是不分前端后端的?;ヂ?lián)網(wǎng)進(jìn)入Web2.0時(shí)...

    DesGemini 評論0 收藏0
  • 前后端的分離模式

    摘要:采用前后端分離模式可以減后臺(tái)負(fù)擔(dān),加快研發(fā)效率,當(dāng)然,前提是前端能做好的話。還是基礎(chǔ)不夠?qū)е碌暮蠖耸欠耧L(fēng)格很多公司采用了前后端分離模式后,后端仍然采用以往的傳統(tǒng)風(fēng)格,這是不合理的,風(fēng)格的應(yīng)該是前后端分離的最佳實(shí)踐。 showImg(https://segmentfault.com/img/bVFC8f?w=690&h=360);早期的web開發(fā)是不分前端后端的。互聯(lián)網(wǎng)進(jìn)入Web2.0時(shí)...

    whlong 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<