关键词:
前言
都说nodejs适合制作restful_API,因为它有异步处理能力,能吞吐更多的请求,这一点是大家都认可的。前不久我使用nodejs+express+postgresql搭建了一个restful中间处理平台,感觉express的api在代码量多的时候,显得凌乱。然后我开发了一个能够更好的组织express代码的module,借鉴了一些java中的想法。希望达到一种平衡,一种更优雅的方式组织代码。
express
一个express项目的编码流程,大概是几步,
1.初始化app (express())
2.引入routes 引入路由,再由路由分发router
3.定义router
4.编写methods,get、post之类的响应
5 前端请求
拿我自己的项目看,这是一个router:
var express = require("express"); var router = express.Router(); var config = require("config-lite"); var check = require("../lib/check"); var select = require("../db/select"); router.get("/",check,(req,res,next)=>{ res.render("index",{ pageName:"jiankong" }) });
router.post("/",check,(req,res,next)=>{
res.send({
msg:"jiankong"
})
});
module.exports = router;
这里面能有什么问题?——当代码量增大,各种app.get .post堆在一个文件夹下,或者把这些拆分成大量文件。这显然不利于代码的维护。
我的解决方案
我需要解决编写restful或者web应用时,代码不容易理解的问题。 所以我写了一个module:Ting.js
我需要的特性:
1.能够根据代码生成文档
2.代码逻辑更清晰
3.最好router能够直接配置
经过半个多月的开发。现在我的代码已经改造了我所有的项目。我认为它的代码逻辑足够清晰。比如router的定义:
module.exports = [ { brie:"首页", desc:"这是首页的整体说明", path:"/", class:Home, rules:{ //对象 get:[ { brie:"这是首页的get访问方法", desc:"返回了hello world", path:"/", controller:["getHome"] } ] } } ]
这段代码配置了一个path是/的router 其中它有一个get方法,处理函数是类Home的getHome方法。
感兴趣?那看看下面的教程,运行一个demo试试
ting.js
ting.js for 1.1.12 基于express的server工程化组件
开始之前
在一切开始之前,你需要具备express知识,另外,需要生成一份package.json。
准备就绪后,就开始吧!
Step 3: 创建index.js
入口文件
const path = require("path"); //引入express const express = require("express"); //express_app var app = express(); var ting = require("ting.js"); //定义routes var routes = require("./routes"); //引入_package var _package = require("./package.json"); //doc路径 _package.doc.path = path.join(__dirname,_package.doc.path); //初始化 var ting_fn = function(init){ init(routes); } //生成路由 ting(app,ting_fn,_package); //监听 app.listen(8090,()=>{ console.log("ting_server started 8090"); });
Step 4: 创建routes.js
配置routes规则
//处理类 var Home = require("./home.class"); //定义规则 module.exports = [ { brie:"首页", desc:"这是首页的整体说明", path:"/", class:Home, rules:{ //对象 get:[ { brie:"这是首页的get访问方法", desc:"返回了hello world", path:"/", Examination:true, //开启代码视图 controller:["getHome"] } ] } } ]
Step 5: 创建home.class.js
替代复杂的router,使用类文件作为请求入口
class Home{ main(){ } getHome(req,res,next){ res.send("hello world"); } } module.exports = Home;
Step 6: 运行测试
项目目录打开命令行运行
node index
访问localhost:8090
你可以看到类Home调用了getHome,顺利返回hello world,
它还可以生成文档,在每次启动时根据package中的version生成html文档,配置方法在API中,也可以在我的gethub上的serverdemo中看到,地址附在资源一栏中。
总结
我觉得ting.js还可以在doc上下功夫,比如用代码标注方法,标注类,使用代码添加注释。另外配置文件的方式,可以通过中间服务,达成多人开发的效果,这些是我以后想做的。不过现在还是希望有朋友给我提交几个issues,完善现在的代码
https://github.com/294678380/Ting.js_server_demo/issues
资源
gethub: https://github.com/294678380/Ting.js
API: http://www.tingjs.top/api
一个demo的github: https://github.com/294678380/Ting.js_server_demo
无服务器 NodeJS / 本机 node_modules
...使用无服务器框架在AWSLambda中加载节点模块时遇到问题。我的一个节点包使用本机库,因此我使用EC2创建node_module文件夹,然后将它们复制到我的无服务器项目中。如果我手动压缩项目并上传到AWSLambda,一切正常,但如果 查看详情
Nodejs/Express/Typescript 需要 module.exports
...audia的AWSLambda执行。我想将应用配置和app.listen函数分开。我的app. 查看详情
运维之我的docker-使用elk处理docker日志
因为docker产生的容器不是一个永久存储的文件,所以无法保证你的文件永久保存。建议大家把容器产生的日志通过fluentd,flume,logstash等工具传送到一个日志仓库,这样保证方便保证数据的安全和管理。由于docker官方的... 查看详情
NodeJS 的多个 module.exports
...eJS【发布时间】:2019-01-0209:05:57【问题描述】:我试图在我的NodeJS模块中添加两个module.exports。我为我的模块尝试了以下代码:exports.one=function(data)constone=data;;module.exports=function(msg)console.l 查看详情
运维之我的docker-集群的管理-swarm
使用docker引擎的swarm模式是v1.12.0版本以后的新特性,我们使用dockercli创建一个swarm,部署和管理应用服务集群。swarm集群特色docker引擎综合了集群管理功能:默认自带集群服务的管理工具,不需要额外的工... 查看详情
fragment之我的解决方案:fragmentation
...坑2、Fragment全解析系列(二):正确的使用姿势3、Fragment之我的解决方案:Fragmentation附:SwipeBackFragment的实现分析如果你通读了本系列的前两篇,我相信你可以写出大部分场景都能正常运行的Fragment了。如果你想了解更多,那么... 查看详情
运维之我的docker-部署私有仓库registry
因为生产情况下官方容器还是比较慢的,所以会用到自建docker仓库。docker官方提供完整部署仓库的容器,你只需要提供域名证书,把文件系统挂载到容器,一个用户密码文件就可以使用基本的仓库功能了。数据... 查看详情
运维之我的docker-单机多容器的编排-compose
docker-compose是定义和运行多容器Docker应用程序的工具。我们可以把特定的几个容器组合起来构建成一个应用向下图一样。看上去有点像我们以前用过的saltstack的使用方式一样,同样compose使用yaml语法,通过这种方式... 查看详情
求助:关于nodejs使用express,报错:模块缺失
今天学习下nodejs,结果在安装使用express时出现了如下错误:Error:Cannotfindmodule'character-parser'atFunction.Module._resolveFilename(module.js:338:15)atFunction.Module._load(module.js:280:25)atModule.require(module.js:364:17)atrequire(module.js:380:17)atObject.<anonym... 查看详情
NodeJs:有没有办法找出我的程序没有使用哪些模块?
】NodeJs:有没有办法找出我的程序没有使用哪些模块?【英文标题】:NodeJs:Isthereawaytofigureoutwhatmodulesarenotbeingusedbymyprogram?【发布时间】:2018-06-0911:19:17【问题描述】:原谅我,因为我对NodeJs还是很陌生。所以我有一个带有“node_... 查看详情
从“node_modules”以外的位置引用 NodeJS 库而不使用相对路径
】从“node_modules”以外的位置引用NodeJS库而不使用相对路径【英文标题】:ReferenceNodeJSlibsfromlocationsotherthan"node_modules"withoutusingrelativepath【发布时间】:2017-10-1617:43:27【问题描述】:假设我有2个用于NodeJS库的文件夹,即“... 查看详情
运维之我的docker-compose快速创建zookeeper集群
很多时候大家不同的容器想要不用启动参数这个时候不妨使用脚本封装来实现,官方也很推荐这个做法,这里介绍下如何使用脚本传参快速启动一个zookeeper集群。 zookeeper集群大家知道有部分通用配置,和一些动... 查看详情
无法提取地理键(nodejs 和 mongo)
...架)和mongodb和mongoose。我正在尝试将地理位置坐标保存到我的数据库中。这是我的架构的样子://definingaschemavarTopicSchema=mongoose.Schema(topi 查看详情
好好学习天天编程—c语言之我的第一个helloworld
好好学习天天编程—C语言之我的第一个helloworld(二) 查看详情
运维之我的docker-阿里云加速你的docker
这里是我阿里云帐号下的帮主文档和大家分享一下下面“https://xxxx.mirror.aliyuncs.com”为加速地址因为这个是阿里云免费提供的大家可以注册阿里云帐号自己申请,本文章为演示地址,以免影响大家使用位置在->控制台->产品服... 查看详情
nodejs module.js:340 错误:找不到模块
...nodejs中安装了nodejs然后我创建了一个.js文件并将其保存在我的桌面中,只是为了在控制台中输出“helloworld”:console.log(\'hellowor 查看详情
Nodejs找不到模块
...ule【发布时间】:2014-01-2914:04:21【问题描述】:我在尝试使用任何全局模块时遇到错误,例子:Error:Cannotfindmodule\'express\'atFunction.Module._resolveFilename(module.js:338:15)atFunction.Module._load(module.js:280:25) 查看详情
1220光辉岁月之我的目标
青春虽已散场,但梦想依旧继续 今天进入天启第一天,认识了新同学,心里开心,看得出同学们都很热情;我们来自不同的地方,可是却为了一个梦想 老师也很帅气,幽默风趣;布置下作业:写一下理想,我脑子很慢,... 查看详情