当前位置: 首页 > 后端技术 > Node.js

nodejs实现restfulAPI

时间:2023-04-03 12:11:39 Node.js

更新:最新的源码和使用说明放在github上。点击跳转。本文的重点是restful接口的设计与实现,使用express和monogose。点击查看速成教程。点击查看monogose教程。ES6入门教程----阮一峰的博客node4.x没有完美支持ES6。建议使用更高版本的节点。实际开发中,请在文件开头加上'usestrict'声明使用strict模式,以帮助更多人理解后面的代码,我们先来了解一下ES6类和继承ES6类和继承1.定义和使用//定义一个基类classBaseService{add(){console.log('baseadd');//基础添加}remove(){console.log('baseremove')//基础删除}}//实例化varbase=newBaseService();base.add();//output'baseadd'2.Inheritance//重载基类的方法//添加一个私有方法类UserServieextendsBaseService{add(){console.log('useradd');//useradd}findTop5(){console.log('1,2,3,4,5');//1,2,3,4,5}}nodemodules接下来了解node中的模块。如果你想使用ES6模块,你需要使用babel1。导出基类NewbaseService.jsclassService{add(){console.log('baseadd');//baseadd}remove(){console.log('baseremove')//baseremove}}exports.服务=服务;2.在子类中引用基类新建userService.jsvarbaseService=require('./baseService').service;class服务扩展baseService{findTop5(){console.log('1,2,3,4,5');//1,2,3,4,5}add(){console.log('useradd');//用户添加}}exports.service=Service;搭建项目结构,下面会用到monogose和express相关技术。不明白的可以看本文顶部的链接1.用express初始化项目后添加models文件夹和services文件在models文件夹新建userModel.jsvarmongoose=require('mongoose');varSchema=mongoose.Schema;varmodel=newSchema({name:String});exports.model=mongoose.model('userModel',model);在服务文件夹中新建一个baseService.jsvarmongoose=require('mongoose');varSchema=mongoose.Schema;classService{constructor(){}add(obj,name,callback){varname=name||'';变量结果={};varinstance=this.entity(obj);instance.save(function(err,item,numAffected){if(err){result={'ok':false,'data':{},'message':'New'+name+'Failure'}}else{result={'ok':true,'data':item,'message':'New'+名称+'成功'}}回调(结果);});}delete(obj,name,callback){varresult={};varid=obj.id;this.entity.remove({'_id':id},function(err){if(err){result={'ok':false,'data':{},'message':'delete'+name+'失败'};}else{result={'ok':true,"data":{},'message':'delete'+name+'success'};}callback(result);});}}exports.service=服务;然后创建一个新的用户服务。js,引用对应的model,实现userService对baseService的继承varbaseService=require('./baseService').service;varmongoose=require('mongoose');varSchema=mongoose.Schema;varmodel=require('../models/userModel').model;class服务扩展baseService{constructor(){super();这个实体=模型;}}exports.service=服务;在userService.js中我们可以重写基类方法,也可以像上面说的那样添加自己的私有方法和属性,我们再熟悉一下那么,如果要在子类中调用this,需要先调用super方法,否则新建实例时会报错。这是因为子类没有自己的this对象,而是继承了父类的this对象,然后对其进行处理。如果不调用super方法,子类就无法获取到这个对象。服务类扩展baseService{constructor(){super();这个实体=模型;}add(){console.log('用户添加');}findTop5(){console.log('1,2,3,4,5');}}然后新建services.js文件,统一对外导出服务。下面的代码是实际项目中的代码,仅供参考。exports.userService=require('./userService').service;出口。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文件varexpress=require('express');varrouter=express.Router();varServices=require('../services/services');mongoose.connect('mongodb://localhost/test');/*listenallnamenamemethodmethodparparameterentityentityinstanceservice实例结果返回结果obj请求参数参数为空或错误调用为空防止程序崩溃*/router.post('/:name?/:method?/:par?',function(req,res,next){varname=req.params.name||'empty';varmethod=req.params.method||'empty';varpar=req.params.par||'';varservice=newServices[name+'Service']();varobj=req.body||{};obj.par=par;if(!Services[name+'Service']){service=newServices.emptyService();}service[method](obj,name,function(result){res.json(结果);});返回;});module.exports=路由器;在代码中,我们引用Services,首先通过newServices[name+'Service']()实例化对应的service,然后调用service[method]方法,其中:name?,:method?,:par?都是占位符在前端页面中,我们可以使用$.post('/api/user/add',data,function(){})这是典型的测试API是否能正常运行的方法。作者更喜欢将所有参数放在数据中。如有任何疑问或不解,可发邮件至http_wenwen@163.com