前言
很高興我的node.js處女作開發完成了,目前還在優化完善階段,經歷兩周的緊張溝通和開發,工作總算搞一段落。選用node.js 一是因為這次的業務邏輯相對來說簡單想拿node練練手,二就是相對來說在處理高並發時比較有簡單粗暴的優勢,官方自己的話說處理百萬級並發都很easy,這也是我跟解決方案經理吹牛的理由。
開發完幾個問題
1、因為做項目的慣性,在連接數據庫時就想分層,Dao或者Repository。那么在這次的node項目中我沒有分層,因為連接是在app.js中打開並且通過中間件注入Express Request中,我不知道以什么方式把連接傳入Dao層,當然也不太明確Dao層如何組織,也不太明確如何在路由.js文件中如何更好的調用Dao層。
2、如果生產部署的話肯定是需要綁定域名的,那么目前最簡單的綁定方式和部署方式是什么?(已了解到使用nginx來部署,但還沒實踐,同時也可以處理並發負載)。
用到的技術和知識點
1、Express框架(4.x)。沒什么可說的MVC框架,node.js官方推薦的框架,最起碼你用reqeust,response順手很多。
2、node.js連接Mysql。 在連接mysql時我用了一個插件express-myconnection,並且注冊成中間件可以在每次請求的request那到connection,上一篇文章中總結過, 但隨即我在評論中看到有人持反對態度,並且點了反對,他的理由是你做成中間件,那么每個路由請求中都會連接數據庫。 隨后我又查了官網和其他的一些資料,他們推薦是這樣做的,並且解釋到這樣使用每個connection的生命周期也就是到response結束連接就會釋放掉。
//app.js app.use( connection(mysql, { host: '127.0.0.1', user: 'root', password: '*****', port: '3306', database: 'db' }, 'pool') //選擇資源池,系統自己release connection to poll ); //routes/order.js router.get('/cost', function(req, res, next) { req.getConnection(function(err, conn) { //處理你的數據邏輯 }); });
3、node.js 連接redis。連接redis直接使用createClient,使用不使用pool都可以。
var redis = require('redis'), client = redis.createClient(); //選擇數據庫 client.select('0',function(err){}) //判斷key是否存在 client.exists(key, function(err, result) {}) //設置hash set值 client.hmset(key,[],function(err,result){}) //獲取hash set值 client.hgetall(key, function(err, obj) {}) //獲取key value值 client.get(key, function(err, result) {}); //設置key value client.set(key, opValue, function(err, result) {})
4、使用log4js。當然生產運行的接口程序少不了日志的運行。log4js還能配置發送郵件,但我沒調通,僅僅是報錯時看下log。
//做成json配置文件 { "appenders": [ { "type": "console", "category": "console" }, { "type": "dateFile", "filename": "d:/weblogs/logs/", "pattern": "yyyyMMddhh.txt", "absolute": true, "alwaysIncludePattern": true, "category": "logInfo" } ], "levels": { "logInfo": "DEBUG" } } //調用 var log4js = require('log4js'); log4js.configure('./log4js.json'); var logger = log4js.getLogger('logInfo'); //錯誤日志 logger.err('測試日志'); //info日志 logger.info('測試日志');
