nodejs+java+restful_nodejs实现restful API

更新:

最新的源码和使用说明放到了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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值