nodejs实现restful API

标签(空格分隔): javascript nodejs restful


下载项目
本文的重点在于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;

最后是路由了,在rotues文件夹内新建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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值