资讯专栏INFORMATION COLUMN

nodejs实现restful API

harriszh / 407人阅读

更新:
最新的源码和使用说明放到了github上 点击跳转
本文的重点在于restful接口的设计与实现,使用到了express和monogoose.
点击查看express教程
点击查看monogoose教程
ES6入门教程----阮一峰的博客

node4.x对ES6的支持并不完善,建议使用更高版本的node
在实际开发中请在文件头部添加"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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/84514.html

相关文章

  • 快速学习nodejs系列:十三、nodejs实现restful api、cookie、session

    摘要:在前面的节课程里面,我们已经基本学习完了的知识,达到基础入门的要求。英语的直译就是表现层状态转移。的特点不加密用户可删除可被修改依赖于用户禁用或清除时,读取出错。下节,会开始学习框架。 在前面的12节课程里面,我们已经基本学习完了nodejs的知识,达到基础入门的要求。那为什么会在这节说下使用nodejs来实现一些功能,而不继续往下讲呢?原因有2:1.前面讲地都是理论知识,码代码比较少...

    asce1885 评论0 收藏0
  • 4.3 路由设计/RESTful API-博客后端Api-NodeJs+Express+Mysql实

    摘要:路由设计路由设计以用户注册为例介绍如何闭环用户注册开发注意点使用邮箱注册验证邮箱是否注册目前真实开发业务大部分都是手机号注册,这块由于没有购买短信服务首先,在文件夹下新建上图中对应真实业务逻辑现附上业务实现代码加密国际化工具类用户服务 路由设计 路由设计 以用户注册为例介绍如何闭环用户注册开发注意点:(1)使用邮箱注册(2)验证邮箱是否注册 【目前真实开发业务大部分都是手机号注册,这块...

    1fe1se 评论0 收藏0
  • 前后端的分离模式

    摘要:采用前后端分离模式可以减后台负担,加快研发效率,当然,前提是前端能做好的话。还是基础不够导致的后端是否风格很多公司采用了前后端分离模式后,后端仍然采用以往的传统风格,这是不合理的,风格的应该是前后端分离的最佳实践。 showImg(https://segmentfault.com/img/bVFC8f?w=690&h=360);早期的web开发是不分前端后端的。互联网进入Web2.0时...

    fobnn 评论0 收藏0
  • 前后端的分离模式

    摘要:采用前后端分离模式可以减后台负担,加快研发效率,当然,前提是前端能做好的话。还是基础不够导致的后端是否风格很多公司采用了前后端分离模式后,后端仍然采用以往的传统风格,这是不合理的,风格的应该是前后端分离的最佳实践。 showImg(https://segmentfault.com/img/bVFC8f?w=690&h=360);早期的web开发是不分前端后端的。互联网进入Web2.0时...

    DesGemini 评论0 收藏0
  • 前后端的分离模式

    摘要:采用前后端分离模式可以减后台负担,加快研发效率,当然,前提是前端能做好的话。还是基础不够导致的后端是否风格很多公司采用了前后端分离模式后,后端仍然采用以往的传统风格,这是不合理的,风格的应该是前后端分离的最佳实践。 showImg(https://segmentfault.com/img/bVFC8f?w=690&h=360);早期的web开发是不分前端后端的。互联网进入Web2.0时...

    whlong 评论0 收藏0

发表评论

0条评论

harriszh

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<