• 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

  • 相关阅读:
    AspNetPager
    c#转码解码
    sqlserver插入datetime
    easyui treeJson 带层数
    onblur判断数字
    MemoryStream 转 pdf
    比较全的 C# 操作 Word的代码
    C#代码实现把网页文件保存为mht文件
    C# html转mht
    Asp.Net MVC 在后台获取PartialView、View文件生成的字符串
  • 原文地址:https://www.cnblogs.com/wen-wen/p/6149847.html
Copyright © 2020-2023  润新知