前言
都說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